T1 祖玛

问题描述:温温是一只懒惰的小萌猪。他虽然身负重任,但还是每天上班都偷偷玩游戏。今天,他决定玩一个叫做《祖玛》的老游戏。不过,温温打开游戏
之后,发现这个游戏和印象里不太一样。游戏开始时,温温会得到一串宝石,第i个宝石的颜色是ci。游戏的目标是摧毁所有宝石。在游戏的每一秒钟,温温可以选择宝石序列的任意一个回文子串(即连续的若干个宝石,从前往后和从后往前看颜色是一样的),把这些宝石摧毁。之后左右的宝石会向中间移动,重新组成一个连续的序列。温温想知道他最少要花多长时间才能摧毁所有宝石。

Input
第一行一个整数n,表示一共有n个宝石。
第二行n个整数ci,表示宝石的颜色。
1 ≤ ci ≤ n
30% 数据满足 1 ≤ n ≤ 20
100%数据满足1 ≤ n ≤ 500

Output
输出一个整数,表示最少所需时间。

input
3
1 2 1
output
1

input
7
1 4 4 2 3 2 1
output
2

题解: 区间DP ,f [ l ][ r ] 表示区间 l 到 r 的代价。
首先,区间为回文的消灭的代价为1。
如果 a[ L ] == a [ R ] 那么代价为f[ L+1 ][ R -1 ] ,因为在区间[L+1,R-1] 的最后一次操作要么是一次消灭一个回文串,要么消灭一个单个字符。所以加上a[ L ] 和 a[ R ] 代价不变。
若 a[ L ] != a[ R ] 那么枚举中间点,,常规。
code

#include<bits/stdc++.h>
#define MAXN 505
#define FLIE "zuma"using namespace std;
int n,a[MAXN];
int f[MAXN][MAXN];
bool check(int l,int r)
{while(l<=r){if(a[l]==a[r]) l++,r--;else return false;}return true;
}
int main()
{freopen(FLIE".in","r",stdin);freopen(FLIE".out","w",stdout);cin>>n;for(int i=1;i<=n;i++) scanf("%d",&a[i]);memset(f,10,sizeof(f));for(int i=1;i<=n;i++) f[i][i]=1;for(int len=2;len<=n;len++)for(int l=1;l<=n-len+1;l++){int r=l+len-1;if(check(l,r)) { f[l][r]=1; continue; }if(a[l]==a[r]) f[l][r]=f[l+1][r-1];else for(int mid=l;mid<r;mid++) f[l][r]=min(f[l][r],f[l][mid]+f[mid+1][r]); }   printf("%d",f[1][n]);return 0;
}

T2:电梯

问题描述:九层的楼,有n个人,第 i 个人从 a[ i ] 层出发走到 b[ i ] 层,进入电梯的先后顺序有限制,出电梯不限,电梯起初在1层,输出所有人到达的最小时间。
数据范围
1 ≤ ai, bi ≤ 9
30% 数据满足 :1 ≤ n ≤ 100
100%数据满足:1 ≤ n ≤ 2000

input
2
5 3
3 5
output
12

题解
阶段?当前操作到第 x 个人 前 x 个人要么到达,要么在电梯里。
记录电梯中的状态?由于进电梯顺序的限制,a,b,c 表示电梯中的三个人要到达的楼层,0代表没人,剩下那个人必然是当前操作的人。
当前电梯的位置也要记录,否则花费的计算?

那么状态就是F[ x ][ a ][ b ][ c ][ pos ] ;
每次操作的种类?
现在操作到第 x 个人,要去接他。
先考虑送人。

1,电梯满人,接 x 。然后 送 x || 送 a || 送 b || 送c。
2,电梯未满, 接 x 。
特殊情况?:当操作到 k+1 时 这时候的意义就是 要么结束了,要么电梯里还有人,只要把剩下的人送到就好了。
记忆化。
code

#include<bits/stdc++.h>
#define MAXN 3000
#define FLIE "elevator"using namespace std;
struct note{int st,ed;
}J[MAXN];
int F[MAXN][10][10][10][10];
int n;
inline int A(int x,int y) { return abs(x-y); }
int wor(int x,int a,int b,int c,int pos)
{if(F[x][a][b][c][pos]) return F[x][a][b][c][pos];int ans=MAXN*MAXN;if(x==n+1 && !a && !b && !c) return 0;else if(x==n+1){if(a) ans=min(ans,1+wor(x,0,b,c,a)+A(pos,a)); if(b) ans=min(ans,1+wor(x,a,0,c,b)+A(pos,b));if(c) ans=min(ans,1+wor(x,a,b,0,c)+A(pos,c));return F[x][a][b][c][pos]=ans;}if(a) ans=min(ans,wor(x,0,b,c,a)+A(pos,a)+1); if(b) ans=min(ans,wor(x,a,0,c,b)+A(pos,b)+1);if(c) ans=min(ans,wor(x,a,b,0,c)+A(pos,c)+1);int x_ST=J[x].st,x_ED=J[x].ed;if(a&&b&&c){ans=min(ans,2+wor(x+1,a,b,c,x_ED)+A(x_ST,pos)+A(x_ST,x_ED));ans=min(ans,2+wor(x+1,x_ED,b,c,a)+A(x_ST,pos)+A(x_ST,a));ans=min(ans,2+wor(x+1,a,x_ED,c,b)+A(x_ST,pos)+A(x_ST,b));ans=min(ans,2+wor(x+1,a,b,x_ED,c)+A(x_ST,pos)+A(x_ST,c));}else {if(!a) ans=min(ans,1+wor(x+1,x_ED,b,c,x_ST)+A(pos,x_ST));if(!b) ans=min(ans,1+wor(x+1,a,x_ED,c,x_ST)+A(pos,x_ST));if(!c) ans=min(ans,1+wor(x+1,a,b,x_ED,x_ST)+A(pos,x_ST));}return F[x][a][b][c][pos]=ans;
}
int main()
{freopen(FLIE".in","r",stdin);freopen(FLIE".out","w",stdout);cin>>n;for(int i=1;i<=n;i++) scanf("%d%d",&J[i].st,&J[i].ed);cout<<wor(1,0,0,0,1);return 0;
}

20190716 DP 练习赛相关推荐

  1. 4.28 DP练习赛

    T1:数塔问题 问题描述:相信大家都写过数字三角形问题,题目很简单求最大化一个三角形数塔从上往下走的路径和.走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1).如下图是一个数塔,映 ...

  2. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

  3. 牛客练习赛61 C 四个选项(并查集、DP、排列组合)难度⭐⭐⭐

    链接:https://ac.nowcoder.com/acm/contest/5026/C 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64 ...

  4. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  5. 牛客练习赛26B 烟花 (概率DP)

    链接:https://ac.nowcoder.com/acm/contest/180/B 来源:牛客网 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5 ...

  6. C 简单瞎搞题(牛客练习赛22)(bitset优化dp)

    Bitset优化Dp 题目链接 一般DP做法 显然后面的数是与前面的数字相关的,所以我们有dp数组,dp[i][j]dp[i][j]dp[i][j]选取了jjj个数,iii是否可以被创造出来,如果可以 ...

  7. 牛客练习赛69D-火柴排队【dp】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7329/D 题目大意 nnn个数的序列,排序后让随机kkk个数加上ddd,求依旧满足单调上升的期望概率 解题思 ...

  8. 【Hihocoder - offer编程练习赛86 - C】跳数游戏(STLset或map预处理,dp)

    题干: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个长度为N的数组A1, A2, ... AN,请你判断其中有几个元素Ai按如下跳跃规则能跳到最后一个元素AN ...

  9. 编程练习赛11B 物品价值(装压dp)

    题意:每个物品有m(m<=10)种属性和一个价格,你有n种物品从中任意选择一些物品,让每种属性恰好有奇数个物品拥有,输出满足条件的最大价值和 题解:一看就是明显的01背包问题,但是价格乘以个数的 ...

最新文章

  1. linux中硬链接文件,科学网—Linux:文件的符号链接和硬链接 - 刘洋洋的博文
  2. python类的继承 被继承类放在类后面的括号中
  3. Intel汇编语言程序设计学习-第六章 条件处理-中
  4. pptp client
  5. 【目标检测_概述】recent advances in deep learning for object detection_2019
  6. mySQL 数据库错误
  7. 前端学习(2001)vue之电商管理系统电商系统之获取商品分类数据
  8. Poj2586 每五个月都是亏
  9. Intel超线程技术 Hyper-Threading Technology (3) - 处理器资源与超线程(复制的资源)
  10. primefaces教程_Primefaces Spring和Hibernate集成示例教程
  11. 关于显式量化和隐式量化的英文对照
  12. 脏写 脏读 不可重复读 幻读 读偏差 写偏差 丢失更新 示例
  13. re模块和正则表达式
  14. Netty阶段性学习总结(一)
  15. SQL Server数据库
  16. arcgis使用教程和视频教程
  17. 360壁纸图片API收录
  18. 【Linux】Ubuntu20.04 无法访问 http://cn.archive.ubuntu.com 问题记录解决
  19. props传值强校验validator
  20. 古训:能控制早晨的人,方可控制人生(经典)

热门文章

  1. db2数据插入错误SQL0000W
  2. webpack、rollup、parcel优劣?
  3. vs2019 安装完成没有反应_vs2019安装失败解决方法
  4. TP-LINK NVR与IPC的使用方法
  5. Qt——多种风格的画笔画刷
  6. 夺旗赛 CTF 方向基础简介
  7. Docker-DB2的使用方法
  8. 设非空二叉树的所有子树中,其左子树上的结点值均小于根结点值,而右子树上的结点值均不小于根结点值,则称该二叉树为排序二叉树。对排序二叉树的遍历结果为有序序列的是
  9. 运动会计算机学院的方队,急求计算机学院运动会方队口号
  10. oracle表交集并集,Oracle 并集交集差集