码迷,mamicode.com
首页 > 其他好文 > 详细

LuoGu P1541 乌龟棋

时间:2018-09-11 22:02:56      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:org   include   判断   min   简单   ace   pac   https   namespace   

题目传送门
乌龟棋我并不知道他为啥是个绿题0.0
总之感觉思维含量确实不太高(虽然我弱DP)(毛多弱火,体大弱门,肥胖弱菊,骑士弱梯,入侵弱智,沙华弱Dp)
总之,设计出来状态这题就很简单了
设$f[i][j][k][l]$表示第一种卡片用了$i$张,第二种用了$j$张,以此类推就好了(我太懒了啦)
然后枚举每种卡片,判断满足每种卡片最少用0张,转移就行了!

#include <iostream>
#include <cstdlib>
#include <cstdio>
#define min(a,b) (a<b?a:b)

using namespace std;

const int M=40;
const int N=355;

int f[M][M][M][M],n,m;
int val[N],card[5],x;

int main(){
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;++i) scanf("%d",&val[i]);
    for(register int i=1;i<=m;++i) scanf("%d",&x),++card[x];
    f[0][0][0][0]=val[1];
    for(register int i=0;i<=card[1];++i){
        for(register int j=0;j<=card[2];++j){
            for(register int k=0;k<=card[3];++k){
                for(register int l=0;l<=card[4];++l){
                    register int step=i+(j<<1)+((k<<1)+k)+(l<<2)+1;
                    if(i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+val[step]);
                    if(j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+val[step]);
                    if(k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+val[step]);
                    if(l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+val[step]);
                }
            }
        }
    }
    printf("%d\n",f[card[1]][card[2]][card[3]][card[4]]);
    return 0;
}

LuoGu P1541 乌龟棋

标签:org   include   判断   min   简单   ace   pac   https   namespace   

原文地址:https://www.cnblogs.com/Equinox-Flower/p/9630512.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!