例子当然是王八棋这道题,这道题以前是写烂了

先来一个大暴力,zlw教的暴力~~

 #include<iostream>
using namespace std;
const int maxn=,maxm=;
int a[maxn],b[];
int n,m;
int ans=;
int MAX(int x,int y)
{
return x>y?x:y;
}
void dfs(int dp,int pos,int tmp)
{
ans=MAX(ans,tmp);
for(int i=;i<=;i++)
if(b[i])
{
b[i]--;
dfs(dp+,pos+i,tmp+a[pos+i]);
b[i]++;
}
}
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
cin>>a[i];
for(int i=;i<=m;i++)
{
int x;
cin>>x;
if(x==) b[]++;
if(x==) b[]++;
if(x==) b[]++;
if(x==) b[]++;
}
dfs(,,a[]);
cout<<ans<<endl;
return ;
}

当时真是幼稚地连搜索都写不利索

多维动态规划的意思就是状态有好几个维度,我们在定义状态的时候要开多维数组

这道题里面四种卡牌用了多少了是四种可行的状态,还有一个是当前走到了哪个格子,作为阶段

f[][][][][],然后就是这样了,MLE

这道题的思路是把阶段这一维度压掉,因为其可以用其他的状态来表示

一般的想法是把别的状态压掉,其实同样也能A掉这道题

压掉状态还是自然一些,压掉阶段就不太自然了

即使看上去很自然的样子

总的来说,好题一道,出题人无敌

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x7f7f7f7f;
const int maxn=,maxm=;
int n,m,a,b,c,d,ans;
int t[maxn];
int f[][][][];
int main()
{ scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&t[i]);
int x;
for(int i=;i<=m;i++)
{
scanf("%d",&x);
if(x==) a++;
if(x==) b++;
if(x==) c++;
if(x==) d++;
}
for(int i=;i<=a;i++)
for(int j=;j<=b;j++)
for(int k=;k<=c;k++)
for(int l=;l<=d;l++)
{
if(i!=) f[i][j][k][l]=max(f[i][j][k][l],f[i-][j][k][l]);
if(j!=) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-][k][l]);
if(k!=) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-][l]);
if(l!=) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-]);
f[i][j][k][l]+=t[i+*j+k*+l*+];
}
printf("%d",f[a][b][c][d]);
return ;
}

这是一个5D/0D压成了4D/0D的动态规划?

动态规划:高维DP的更多相关文章

  1. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  2. 【学时总结】◆学时·VII◆ 高维DP

    ◆学时·VII◆ 高维DP 自学之余,偶遇DP…… ◇ 算法概述 顾名思义——一种处理多方面状态的DP,这种DP特点是……每一维的大小都不算太大(不然用dp数组存储下来内存会炸),而且枚举时容易超时… ...

  3. Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

    Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...

  4. 【学习笔记】动态规划—各种 DP 优化

    [学习笔记]动态规划-各种 DP 优化 [大前言] 个人认为贪心,\(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT).这篇文章也是花了我差不多一个月时间才全部完成 ...

  5. Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

    Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...

  6. Leetcode之动态规划(DP)专题-474. 一和零(Ones and Zeroes)

    Leetcode之动态规划(DP)专题-474. 一和零(Ones and Zeroes) 在计算机界中,我们总是追求用有限的资源获取最大的收益. 现在,假设你分别支配着 m 个 0 和 n 个 1. ...

  7. Leetcode之动态规划(DP)专题-486. 预测赢家(Predict the Winner)

    Leetcode之动态规划(DP)专题-486. 预测赢家(Predict the Winner) 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端 ...

  8. Leetcode之动态规划(DP)专题-264. 丑数 II(Ugly Number II)

    Leetcode之动态规划(DP)专题-264. 丑数 II(Ugly Number II) 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n ...

  9. Leetcode之动态规划(DP)专题-198. 打家劫舍(House Robber)

    Leetcode之动态规划(DP)专题-198. 打家劫舍(House Robber) 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互 ...

  10. Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)

    Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock) 股票问题: 121. 买卖股票的最佳时机 122. 买卖股票的最 ...

随机推荐

  1. c++ combination by next_permutation

    #include <iostream> #include <algorithm> #include <vector> int main() { int n, r; ...

  2. 在Linux下通过rpm打包发布Java程序

    这个东西涉及的内容较多,根据下面这些文章慢慢学习 一个简单的例子 http://blog.csdn.net/king_on/article/details/7169384 按照文章中的步骤来,打包之后 ...

  3. 谷歌js编码规范解析

    http://alloyteam.github.io/JX/doc/specification/google-javascript.xm 阅读了谷歌js编码规范,我发现了很多,js的里面很多要注意的问 ...

  4. Python中send()和sendall()的区别

    Python中send()和sendall()的区别 估计每个学习Python网络编程的人,都会遇到过这样的问题: send()和sendall()到底有什么区别? send()和sendall()原 ...

  5. SQL的鸡肋:“视图”

        不知道当年SQL定义者们设计视图时是出于什么样的考虑.实际效果是,视图夹在SQL指令和表之间,形成了一个三明治的结构.在这种结构下做检索,SQL指令每次都要通过视图转换,才能作用到表上.如果不 ...

  6. 洛谷P1379八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...

  7. Word2Vec词向量(一)

    一.词向量基础(一)来源背景  word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系.虽然源码是 ...

  8. deeplearning.ai课程学习(4)

    第四周:深层神经网络(Deep Neural Networks) 1.深层神经网络(Deep L-layer neural network) 在打算使用深层神经网络之前,先去尝试逻辑回归,尝试一层然后 ...

  9. 学习bash——管道命令

    摘要:管道命令概述.常见管道命令的使用(cut/grep.sort/wc/uniq.tee.tr/col/join/paste/expand.xargs.减号-) 一.概述 命令执行完会在屏幕上打印相 ...

  10. Linux 进程,线程,线程池

    在linux内核,线程与进程的区别很小,或者说内核并没有真正所谓单独的线程的概念,进程的创建函数是fork,而线程的创建是通过clone实现的. 而clone与fork都是调用do_fork(),差异 ...