计蒜客-逃生问题(动态规划)

基础的动态规划题目,注意对边界情况和限制条件的判断

#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;
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/81215390