标签:
菜菜赚了钱回来,想起要买很多桶回来,不同地方的桶质量是不同的,他在(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