[NOIP 2010] 烏龜棋
阿新 • • 發佈:2018-07-22
noip div esp its tar show 代碼 blank ++
[題目鏈接]
https://www.luogu.org/problemnew/show/P1541
[算法]
f[x][y][z][t]表示現在剩下x張1號卡片,y張2號卡片,z張3號卡片,t張4號卡片
我們可以通過狀態算出現在所在的位置
轉移十分顯然
[代碼]
#include<bits/stdc++.h> using namespace std; #define MAXN 360 #define MAXS 45 int i,x,y,z,t,n,m,pos; int a[MAXN],cnt[5]; intf[MAXS][MAXS][MAXS][MAXS]; int main() { scanf("%d%d",&n,&m); for (i = 1; i <= n; i++) scanf("%d",&a[i]); for (i = 1; i <= m; i++) { scanf("%d",&x); cnt[x]++; } f[cnt[1]][cnt[2]][cnt[3]][cnt[4]] = a[1]; for (x = cnt[1]; x >= 0; x--) { for (y = cnt[2]; y >= 0; y--) { for (z = cnt[3]; z >= 0; z--) { for (t = cnt[4]; t >= 0; t--) { pos= (cnt[1] - x) + (cnt[2] - y) * 2 + (cnt[3] - z) * 3 + (cnt[4] - t) * 4 + 1; if (x >= 1) f[x - 1][y][z][t] = max(f[x - 1][y][z][t],f[x][y][z][t] + a[pos + 1]); if (y >= 1) f[x][y - 1][z][t] = max(f[x][y - 1][z][t],f[x][y][z][t] + a[pos + 2]); if (z >= 1) f[x][y][z - 1][t] = max(f[x][y][z - 1][t],f[x][y][z][t] + a[pos + 3]); if (t >= 1) f[x][y][z][t - 1] = max(f[x][y][z][t - 1],f[x][y][z][t] + a[pos + 4]); } } } } printf("%d\n",f[0][0][0][0]); return 0; }
[NOIP 2010] 烏龜棋