NOIP2010 烏龜棋
阿新 • • 發佈:2019-05-03
ble 最大 cout std 順序 gis fine else if [1]
題意簡化
傳送門
給定n個格子,每個格子均有其貢獻,與m次前進(每次前進距離在1~4之間,順序隨機),1~n最大化其價值
\(n<=350,m<=120\)
題解
先確定大致方向,顯然是個背包
然後...
不妨設 \(f[a][b][c][d]\) 為用了a張1牌,b張2牌,c張3牌,d張4牌的最大答案
當前所在的位置就是 \(a+b*2+c*3+d*4\)
接著暴力DP就好
代碼
#include<bits/stdc++.h> #define rnt register int #define c f[c1][c2][c3][c4] using namespace std; int f[45][45][45][45],a[395],b1,b2,b3,b4,n,m; int main() { cin>>n>>m; for(rnt i=1;i<=n;i++) cin>>a[i]; for(rnt i=1;i<=m;i++) { rnt x;cin>>x; if(x==1)b1++;else if(x==2)b2++;else if(x==3)b3++; else b4++; } f[0][0][0][0]=a[1]; for(rnt c1=0;c1<=b1;c1++) for(rnt c2=0;c2<=b2;c2++) for(rnt c3=0;c3<=b3;c3++) for(rnt c4=0;c4<=b4;c4++) { long long k=1+c1+c2*2+c3*3+c4*4; if(c1!=0)c=max(c,f[c1-1][c2][c3][c4]+a[k]); if(c2!=0)c=max(c,f[c1][c2-1][c3][c4]+a[k]); if(c3!=0)c=max(c,f[c1][c2][c3-1][c4]+a[k]); if(c4!=0)c=max(c,f[c1][c2][c3][c4-1]+a[k]); } cout<<f[b1][b2][b3][b4]; }
NOIP2010 烏龜棋