题意:最多可以拿走多少个糖果。当拿走一个糖果的时候,他左右两边的两个和上一行和下一行的两行都会没有。
先横向再纵向DP:状态转移:dp[i] = max(dp[i-2],dp[i-3])+dp[i]; 求最大值就行了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N = 100009;
int map[N];
int dp[N];
int n,m;
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m)&&(n+m))
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&map[1]);
dp[i]=map[1];
if(m>1)
{
scanf("%d",&map[2]);
dp[i] = max(dp[i],map[2]);
}
for(int j=3;j<=m;j++)
{
scanf("%d",&map[j]);
map[j] = max(map[j-2],map[j-3])+map[j];
dp[i] =max(dp[i],map[j]);
}
}
//for(int i=1;i<=n;i++) cout<<dp[i]<<" ";cout<<endl;
int ans=dp[1];
if(n>1) ans = max(ans,dp[2]);
for(int i=3;i<=n;i++)
{
dp[i] = max(dp[i-2],dp[i-3])+dp[i];
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}