codevs1068乌龟棋-四维DP,五维如何缩减一维

我们从起点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;
}
时间: 2024-10-10 22:25:30

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

【基础练习】【背包DP】codevs1068 乌龟棋题解

题目来自2010NOIP提高组 题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. -- 1 2 3 4 5 --N 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型 的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡 片后,乌龟棋子将向前爬行相应的格子数.

18.03.05 codevs1068 乌龟棋

题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. …… 1 2 3 4 5 ……N 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型 的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡 片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行

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

P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行

Problem D: 乌龟棋【四维dp】

Problem D: 乌龟棋 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 24  Solved: 15[Submit][Status][Web Board] Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行 N 个格子,每个格子上一个分数(非负整数).棋盘第 1 格是唯一 的起点,第 N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中 M 张爬行卡片,分成 4 种不同的类型(M 张

NOIP2010乌龟棋[DP 多维状态]

题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前

tyvj 1402 乌龟棋 dp

P1402 [NOIP2010]乌龟棋 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2010提高组复赛第二题 描述 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数).棋盘第1 格是唯一 的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 1 2 3 4 5 …… N 乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型 的卡片,见

背包DP:乌龟棋

题目描述  Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. …… 1 2 3 4 5 ……N 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型 的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡 片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬

洛谷 P1541 乌龟棋 Label:O(n^4)的dp

题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前

【题解】 P1541 乌龟棋总结

题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前