题解——P1133 教主的花园DP
直接设二维状态具有后效性,会爆零
然后需要加一维
然后70
看了题解之后发现没有考虑1和n的关系
考虑之后,四十
然后懵逼
突然发现自己的ans更新写错了,导致每次ans都是第一个取30的情况的解
然后回到70
之后修改了一下初始化
初始化的时候也要注意排除自己假设之外的情况
100
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n,dp[200200][4][2],a[200200][4],ans=0; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=3;j++) scanf("%d",&a[i][j]); for(int fi=1;fi<=3;fi++){ dp[1][1][0]=dp[1][2][0]=dp[1][3][0]=dp[1][1][1]=dp[1][2][1]=dp[1][3][1]=0; dp[1][fi][0]=dp[1][fi][1]=a[1][fi]; for(int i=2;i<=n;i++){ dp[i][1][0]=0; dp[i][1][1]=max(dp[i-1][2][0],dp[i-1][3][0])+a[i][1]; dp[i][2][0]=dp[i-1][1][1]+a[i][2]; dp[i][2][1]=dp[i-1][3][0]+a[i][2]; dp[i][3][1]=0; dp[i][3][0]=max(dp[i-1][1][1],dp[i-1][2][1])+a[i][3]; } if(fi==1){ ans=max(ans,max(dp[n][2][0],dp[n][3][0])); } else if(fi==2){ ans=max(ans,max(dp[n][1][1],dp[n][3][0])); } else{ ans=max(ans,max(dp[n][1][1],dp[n][2][1])); } } printf("%d",ans); return 0; }