CF358D Dima and Hares dp

mac2024-02-20  40

状态的定义挺奇特的~ 

发现最终每一个物品一定都会被选走. 

令 $f[i][0/1]$ 表示 $a[i]$ 在 $a[i-1]$ 前/后选时 $1$~$(i-1)$ 的最优解.                 

因为一个数字的价值只由其相邻两边决定~ 

code:

#include <bits/stdc++.h> #define N 3007 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n; ll f[N][2],g[N],a[N],b[N],c[N],ans; int main() { // setIO("input"); int i,j; scanf("%d",&n); for(i=1;i<=n;++i) scanf("%lld",&a[i]); for(i=1;i<=n;++i) scanf("%lld",&b[i]); for(i=1;i<=n;++i) scanf("%lld",&c[i]); memset(f, -0x3f, sizeof(f)); f[1][0]=0; for(i=2;i<=n+1;++i) { f[i][0]=max(f[i-1][0]+b[i-1], f[i-1][1]+c[i-1]); f[i][1]=max(f[i-1][0]+a[i-1], f[i-1][1]+b[i-1]); } printf("%lld\n",f[n+1][1]); return 0; }

  

最新回复(0)