1. 程式人生 > >[NOIP 2010] 烏龜棋

[NOIP 2010] 烏龜棋

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];
int
f[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] 烏龜棋