P1541 乌龟棋(DP 状态设计)

直接设 \(dp(a,b,c,d)\) 表示各种卡牌对应个数即可。
转移显然,就是唐氏题。

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt[5],pt[360],dp[44][44][44][44];

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&pt[i]);
    for(int i=1,x;i<=m;i++) scanf("%d",&x),cnt[x]++;
    for(int a=0;a<=cnt[1];a++) for(int b=0;b<=cnt[2];b++)
    for(int c=0;c<=cnt[3];c++) for(int d=0;d<=cnt[4];d++){
        if(a>0) dp[a][b][c][d]=max(dp[a][b][c][d],dp[a-1][b][c][d]);
        if(b>0) dp[a][b][c][d]=max(dp[a][b][c][d],dp[a][b-1][c][d]);
        if(c>0) dp[a][b][c][d]=max(dp[a][b][c][d],dp[a][b][c-1][d]);
        if(d>0) dp[a][b][c][d]=max(dp[a][b][c][d],dp[a][b][c][d-1]);
        dp[a][b][c][d]+=pt[1+a+b+b+c+c+c+d+d+d+d];
    }
    printf("%d\n",dp[cnt[1]][cnt[2]][cnt[3]][cnt[4]]);
    return 0;
}
posted @ 2026-02-15 18:36  2025ing  阅读(1)  评论(0)    收藏  举报