基础的动态规划题目,注意对边界情况和限制条件的判断
#include <stdio.h>
#include <stdlib.h>
int escape(int **maze, int n, int m,
int initialHP, int maximumHP) {
int maxHP[n+5][m+5];
for(int i = 0; i <= n; i++)
for(int j = 0; j <= m; j++)
maxHP[i][j] = 0;
maze[1][1] = initialHP;
for(int i = 1; i <= n; i++)
maxHP[i][1] = maxHP[i-1][1] + maze[i][1];
for(int j = 1; j <= m; j++)
maxHP[1][j] = maxHP[1][j-1] + maze[1][j];
for(int i = 2; i <= n; i++)
for(int j = 2; j <= m; j++){
if(maxHP[i][j-1] > maxHP[i-1][j])
maxHP[i][j] = maxHP[i][j-1] + maze[i][j];
else
maxHP[i][j] = maxHP[i-1][j] + maze[i][j];
if(maxHP[i][j] > maximumHP)
maxHP[i][j] = maximumHP;
}
if(maxHP[n][m] <= 0)
return -1;
if(maxHP[n][m] >= maximumHP)
return maximumHP;
return maxHP[n][m];
}
int main() {
int n, m, v, c;
scanf("%d %d %d %d", &n, &m, &v, &c);
int **a = malloc(sizeof(int*) * (n + 1));
for (int i = 0; i <= n; ++i) {
a[i] = malloc(sizeof(int) * (m + 1));
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
scanf("%d", &a[i][j]);
}
}
printf("%d\n", escape(a, n, m, v, c));
return 0;
}