题意:最多可以拿走多少个糖果。当拿走一个糖果的时候,他左右两边的两个和上一行和下一行的两行都会没有。
先横向再纵向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; }