2 solutions

  • 2
    @ 2021-11-8 20:50:23

    这是一个dp板子题,可以百度dp或动态规划自行学习,要注意的点就是第一行和第一列的处理,因为只能向右向下,所以第一行和第一列每一格假如要走的步数只能由前一格推来,只有一个方向,状态转移方程比较好找,不懂的可以对照样例手推,并且要对数组初始化。

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N = 200;
    
    int dp[N][N],a[N][N];
    int n,m;
    
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--) {
    		scanf("%d%d",&n,&m);
    		memset(dp,0,sizeof dp);
    		for(int i = 1;i <= n; ++i) {
    			for(int j = 1;j <= m; ++j) {
    				scanf("%d",&dp[i][j]);
    			}
    		}
    		for(int i = 1;i <= n; ++i) dp[i][1] += dp[i-1][1];
    		for(int i = 1;i <= m; ++i) dp[1][i] += dp[1][i-1];
    		for(int i = 2;i <= n; ++i) {
    			for(int j = 2;j <= m; ++j) {
    				dp[i][j] += min(dp[i - 1][j],dp[i][j - 1]);
    			}
    		}	
    		printf("%d\n",dp[n][m]);
    	}
    		
    	return 0;
    }
    

    Information

    ID
    154
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    # Submissions
    39
    Accepted
    16
    Uploaded By