想到最后一步放弃了,又看了一下其他大哥的讲解,奶奶个腿滴
#include <stdio.h>

int main(){
    int n = 0,m = 0;
    scanf("%d %d",&n,&m);
    int arr[n][m];
    int dp1[n][m];
    int tmp = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            scanf("%d",&arr[i][j]);
            dp1[i][j] = 0;
        }
    }
    int i = 0;
    int j = 0;
    //逆向是核心1
    for(i = n-1; i >= 0; i--){
        for(j = m-1; j >= 0; j--){
            if(i == n-1 && j == m-1){
                if(arr[i][j] >= 0){
                    dp1[i][j] = 1;
                }
                else{
                    dp1[i][j] = 1 - arr[i][j];
                }
            }
            else if(i == n-1){
                tmp = dp1[i][j+1] - arr[i][j];
                dp1[i][j] = tmp > 1 ? tmp : 1;
            }
            else if(j == m-1){
                tmp = dp1[i+1][j] - arr[i][j];
                dp1[i][j] = tmp > 1 ? tmp : 1;
            }
            else{
                //这里的判断条件是核心2
                tmp = dp1[i+1][j] < dp1[i][j+1] ? dp1[i+1][j] : dp1[i][j+1];
                tmp = tmp - arr[i][j];
                dp1[i][j] = tmp > 1 ? tmp : 1;
            }
        }
    }
    printf("%d",dp1[0][0]);
    return 0;
}