3 4 3 1 2 8 5 3 4 6 1 0 2 3
24
简单的dp问题,开始看到这道题一直想用搜索来做,分为两个方向搜索,后来自己写的时候发现写不下去了,因为这里的每次的两个方向的起始值是一样的,所以应该是思路有问题,所以就换了种思路,用动态规划来做,动态规划额的思想是从后面开始递推,保证当前位置的最优,所以我们就直接模拟kk走过的路线,kk只能向右走,或者向下走,我们就每次对这两个方向进行比较,选出一个最大值,当前的步数取决于前一步所走的位置;
所以我们就能得到状态关系式,dp[i][j]=max(dp[i][j-1],dp[i-1][j])+map[i][j];因为是从后面开始递归,最大值的前一步就是向上,或者向左;
下面是代码;
#include <cstdio> #include <cstring> #define max(a,b) a>b?a:b int map[25][25],dp[25][25]; int main() { int n,m,i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&map[i][j]); for(i=1;i<=n;i++) for(j=1;j<=m;j++) //dp[i][j]=max(dp[i-1][j]+map[i][j],dp[i][j-1]+map[i][j]);//这两种递推关系式都可以 map[i][j]+=max(map[i][j-1],map[i-1][j]); printf("%d\n",map[n][m]); }
原文地址:http://blog.csdn.net/whjkm/article/details/38761639