我们从起点x开始暴力枚举所有决策

于是可以得到如下转移

void dfs(int x,int A,int B,int C,int D,int y)
{
if (x==n) {ans=max(ans,y);}
if (A) dfs(x+1,A-1,B,C,D,y+a[x+1]);
if (B) dfs(x+2,A,B-1,C,D,y+a[x+2]);
if (C) dfs(x+3,A,B,C-1,D,y+a[x+3]);
if (D) dfs(x+4,A,B,C,D-1,y+a[x+4]);
}

但是我们发现如果定义dp[A][B][C][D]为用了A,B,C,D张相应种类的牌所能达到的最大价值

或者我实际上定义的语义是剩余cnt[1]-A,cnt[2]-B,cnt[3]-C,cnt[4]-D,张相应种类的牌所能达到的最大价值,

那么按照我的语义,dp[A][B][C][D]=max(dp[A][B][C][D],

max(dp[A+1][B][C][D],dp[A][B+1][C][D],dp[A][B][C+1][D],dp[A][B][C][D+1])+a[A*1+B*2+C*3+D*4+1]);千万不要丢掉1,因为唯一的起点是1

不得不说。。样例感人。。因为我少了一个一。。默认起点是0,不明白这一点样例都过不了

但是其实更加精髓的是如果我们这么定义dp的语义,那么我们前面的dp的位置那一维就不必考虑,从已有的四维状态能推出位置

下面贴上180ms程序。。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std;
int n,m;
int a[405],cnt[5];
int dp[41][41][41][41];
int dfs(int A,int B,int C,int D){
if(dp[A][B][C][D]!=-1) return dp[A][B][C][D];
int p=0;
if(A<cnt[1]) p=max(p,dfs(A+1,B,C,D));
if(B<cnt[2]) p=max(p,dfs(A,B+1,C,D));
if(C<cnt[3]) p=max(p,dfs(A,B,C+1,D));
if(D<cnt[4]) p=max(p,dfs(A,B,C,D+1));
return dp[A][B][C][D]=p+a[A*1+B*2+C*3+D*4+1];//注意!唯一的起点是1不是0
}
int main(){
scanf("%d%d",&n,&m);
int i,x;
for(i=1;i<=n;++i) scanf("%d",a+i);
memset(cnt,0,sizeof(cnt));
for(i=1;i<=m;++i) {scanf("%d",&x);cnt[x]++;}
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(0,0,0,0));
return 0;
}

codevs1068乌龟棋-四维DP,五维如何缩减一维的更多相关文章

  1. 洛谷P1541 乌龟棋(四维DP)

    To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...

  2. P1541 乌龟棋 线性dp

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏要求玩家控制一个乌龟棋子 ...

  3. codevs1068乌龟棋

    codevs1068乌龟棋 1068 乌龟棋 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamon   题目描述 Descrip ...

  4. P1541 乌龟棋(DP)

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NNN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NNN格是终点,游戏要求玩家控制一个乌龟 ...

  5. codevs1068 乌龟棋==洛谷P1541 乌龟棋

    P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...

  6. 洛谷$1541$ 乌龟棋 线性$DP$

    Luogu   CH Sol f[i]表示走到第i个格子时获得的最大分数 发现转移与各个爬行卡片的数量有关,一共只有4种卡片 所以就把这四种卡片的已使用张数也放进状态,f[i][a][b][c][d] ...

  7. Problem D: 乌龟棋【四维dp】

    Problem D: 乌龟棋 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 24  Solved: 15[Submit][Status][Web Boa ...

  8. NOIP2010乌龟棋[DP 多维状态]

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  9. 【洛谷】P1541 乌龟棋(四维背包dp)

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

随机推荐

  1. 2.4V升3.3V,2.4V升3V,1A大电流升压芯片

    两节镍氢电池串联就是1.2V+1.2V=2.4V的供电电压了,2.4V升3V, 2.4V升3.3V的话,就能稳压稳定给模块供电了,镍氢电池是会随着使用的电池电量减少的话,电池的电压也是跟着变化的,导致 ...

  2. 阿里面试常问的redis数据结构,建议收藏

    关于Redis redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库.它支持包括String.List.Set.Zset.hash五种数据结构.除此之外,通过 ...

  3. 图像Demosaic算法及其matlab实现

    由于成本和面积等因素的限定,CMOS/CCD在成像时,感光面阵列前通常会有CFA(color filter array),如下图所示,CFA过滤不同频段的光,因此,Sensor的输出的RAW数据信号包 ...

  4. 【Android初级】使用TypeFace设置TextView的文字字体(附源码)

    在Android里面设置一个TextView的文字颜色和文字大小,都很简单,也是一个常用的基本功能.但很少有设置文字字体的,今天要分享的是通过TypeFace去设置TextView的文字字体,布局里面 ...

  5. ././include/linux/kconfig.h:4:32: fatal error: generated/autoconf.h: No such file or directory 解决办法

    我在编写内核驱动模块的时候报了一个非常奇怪的错误,如下图: 在目录下看了一下确实没有发现这个文件,感觉很奇怪,因为我记得之前编译模块是没有错误的,所以不可能是我代码写的有问题. 查阅了资料很多说要清除 ...

  6. 为什么 Go 模块在下游服务抖动恢复后,CPU 占用无法恢复

    为什么 Go 模块在下游服务抖动恢复后,CPU 占用无法恢复 https://xargin.com/cpu-idle-cannot-recover-after-peak-load/ 极端情况下收缩 G ...

  7. 题解 CF620E 【New Year Tree】

    有关dfs序的例题,需要有一定的位运算基础 题面 给定一个树,树上有颜色,将某一子树的颜色统一修改,求子树中颜色的数量 Solution 子树修改,子树求和,dfs序的知识(类似区间修改区间求和) 考 ...

  8. LOJ10131暗的连锁

    题目描述 原题来自:POJ 3417 Dark 是一张无向图,图中有 N 个节点和两类边,一类边被称为主要边,而另一类被称为附加边.Dark 有 N–1 条主要边,并且 Dark 的任意两个节点之间都 ...

  9. Gitlab + DRBD HA

    部署简介: 为了gitlab有容灾的能力,所以部署一个HA的小集群,用到的软件有 gitlab 和brbd,目前现有环境为 master节点 系统版本:CentOS release 6.5 (Fina ...

  10. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes

    传送门 题意: 先输入一个n,代表两个数组里面都有n个数,然后让你从中找到一个p<=n,使其满足(1<=l<=r<=p<=n)可以让在(l,r)这个区间内在两个数组中的的 ...