标签:
题目描述:
在n*m的一块苹果田中,没一单位面积都有若干苹果,从(1,1)坐标开始采集,每次只能向下或向右移动,请问采集的最多苹果个数? :)
for example:
3 3
1 2 3
6 8 9
1 1 1
很明显答案是:25 。
先向下1步,然后向右2步,再向下1步。
思路:
代码中dp数组,用来存储当前状态最大值,apple数组用来存储对应地点的苹果数目。
这题要用动态规划,求采集苹果最多个数,其实就是求走到(n,m)坐标时最多个数。
分成一个个子问题,对于当前坐标(i,j),只可能是从(i-1,j)或者是从(i,j-1)移动过来的。
所以dp[i][j]=max(dp[i-1][j],dp[i][j-1])+apple[i][j]。
代码:
#include<stdio.h> #include<string.h> #define MAX 100 int main() { int n,m; int dp[MAX+7][MAX+7],apple[MAX+7][MAX+7]; while(scanf("%d%d",&n,&m)!=EOF) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&apple[i][j]); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { dp[i][j]=dp[i-1][j]>=dp[i][j-1]?dp[i-1][j]:dp[i][j-1]; dp[i][j]+=apple[i][j]; } } printf("%d\n",dp[n][m]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/burning-flame/p/4960676.html