标签:
菜菜赚了钱回来,想起要买很多桶回来,不同地方的桶质量是不同的,他在(1,1)点出发因为飞机票有点贵所以他只能向我们的所在地(n,m)处移动,也就是只能向右和下移动,
我们有的桶可能吃腻了所以(i,j)点的值可取可不取;但是菜菜自己也会饿所以在某些城市会吃掉一部分,甚至先透支一部分,所以a(i, j)可以为负,
为了犒劳我们他尽可能会多带一点问他最多带多少质量回来
3 3 1 2 3 4 5 6 4 8 9
27
1 -> 4 -> 5 -> 8 -> 9
原理跟数塔比较像,四种状态:上面和左边走过来(2) * 取或不取(2)。
代码:
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<cstdio> #include<string> #include<deque> #include<stack> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; typedef long long LL; #define INF 0x3f3f3f3f int pos[1010][1010]; int dp[1010][1010]; int main(void) { int n,m,temp,i,j; while (~scanf("%d%d",&n,&m)) { memset(pos,0,sizeof(pos)); memset(dp,0,sizeof(dp)); for (i=0; i<n; i++) { for (j=0; j<m; j++) { scanf("%d",&pos[i][j]); } } dp[0][0]=pos[0][0];//这里要用条件初始化 for (i=0; i<n; i++) { for (j=0; j<m; j++) { dp[i][j]=max(dp[i-1][j],max(dp[i][j-1],max(pos[i][j]+dp[i-1][j],pos[i][j]+dp[i][j-1]))); } } printf("%d\n",dp[n-1][m-1]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/Blackops/p/5456165.html