標籤:
- [1568] 走走走走走啊走
- 時間限制: 1000 ms 記憶體限制: 65535 K
- 問題描述
菜菜賺了錢回來,想起要買很多桶回來,不同地方的桶品質是不同的,他在(1,1)點出發因為飛機票有點貴所以他只能向我們的所在地(n,m)處移動,也就是只能向右和下移動,
我們有的桶可能吃膩了所以(i,j)點的值可取可不取;但是菜菜自己也會餓所以在某些城市會吃掉一部分,甚至先透支一部分,所以a(i, j)可以為負,
為了犒勞我們他儘可能會多帶一點問他最多帶多少品質回來
- 輸入
- 輸入n,m (n,m <= 1000)
再輸入n行m列值A(i,j) A(i,j)在 - 1000 ~ 1000 之間。而且A(i,j)可以取可以不取.只能往右或者往下走。
問你,從左上方走到右下角,可以得到的最大值是多少。
- 輸出
- 輸出最大值
- 範例輸入
3 31 2 34 5 64 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 0x3f3f3f3fint 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;}
NOJ——1568走走走走走啊走(超級入門DP)