[NOIP 2010] 乌龟棋

[题目链接]

          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;
    
}

猜你喜欢

转载自www.cnblogs.com/evenbao/p/9349547.html