【每日一题】7月27日 乌龟棋

乌龟棋

https://ac.nowcoder.com/acm/problem/16590

题解:

每一步最多有4种选择,并且题目保证全部卡片用光后一定会正好走到终点,那么我们直接记忆化搜索就可以
dp[i][j][k][l] 表示 当前1,2,3,4卡片还剩i,j,k,l个得到的最大分数。时间复杂度为O(404040*40)

代码:

#include<bits/stdc++.h>
#define pb push_back
#define SZ(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long ll;
typedef vector<int> VI;
const int maxn = 1e6  + 4;

const int mod  = 1e8 + 7;
const int inf  = 0x3f3f3f3f;
const int N = 5005;
ll qpow(ll x,ll y){ll ans=1;x%=mod;assert(y>=0);while(y){ if(y&1) ans=ans*x%mod; x=x*x%mod; y>>=1;}return ans;}
//ctrl + h     ctrl + shift + t 
//ctrl + shift + d/k 
//alt  + shift + 1/2/3/4

int dp[41][41][41][41],w[maxn],ct[maxn],n,m,d;

int dfs(int a,int b,int c,int d,int i) {
    if(~dp[a][b][c][d]) return dp[a][b][c][d];

    int ans=0;
    if(a) ans=max(ans,dfs(a-1,b,c,d,i+1));
    if(b) ans=max(ans,dfs(a,b-1,c,d,i+2));
    if(c) ans=max(ans,dfs(a,b,c-1,d,i+3));
    if(d) ans=max(ans,dfs(a,b,c,d-1,i+4));
    return dp[a][b][c][d]=ans+w[i];
}

int main() {
    //freopen("E:\\S_Code\\input.in","r",stdin);

    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&w[i]);
    for(int i=1;i<=m;i++) scanf("%d",&d),ct[d]++;
    memset(dp,-1,sizeof dp);
    printf("%d\n",dfs(ct[1],ct[2],ct[3],ct[4],1));

    return 0;
}
全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务