区间 \(dp\)


1、[HAOI2008]玩具取名

\(f[l][r][W/I/N/G]\) 表示区间 \([l,r]\) 中能否压缩成 \(W/I/N/G\)

\(Code\ Below:\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=200+10;
  4. int n,W,I,N,G,le[maxn],fir[maxn],sec[maxn],f[maxn][maxn][4],cnt;
  5. char s[maxn];
  6. int check(char ch){
  7. if(ch=='W') return 0;
  8. if(ch=='I') return 1;
  9. if(ch=='N') return 2;
  10. return 3;
  11. }
  12. char toalpha(int i){
  13. if(i==0) return 'W';
  14. if(i==1) return 'I';
  15. if(i==2) return 'N';
  16. return 'G';
  17. }
  18. int main()
  19. {
  20. scanf("%d%d%d%d",&W,&I,&N,&G);
  21. char ch;
  22. for(int i=1;i<=W;i++){
  23. ch=getchar();
  24. while(!isalpha(ch)) ch=getchar();
  25. le[++cnt]=0;fir[cnt]=check(ch);
  26. ch=getchar();sec[cnt]=check(ch);
  27. }
  28. for(int i=1;i<=I;i++){
  29. ch=getchar();
  30. while(!isalpha(ch)) ch=getchar();
  31. le[++cnt]=1;fir[cnt]=check(ch);
  32. ch=getchar();sec[cnt]=check(ch);
  33. }
  34. for(int i=1;i<=N;i++){
  35. ch=getchar();
  36. while(!isalpha(ch)) ch=getchar();
  37. le[++cnt]=2;fir[cnt]=check(ch);
  38. ch=getchar();sec[cnt]=check(ch);
  39. }
  40. for(int i=1;i<=G;i++){
  41. ch=getchar();
  42. while(!isalpha(ch)) ch=getchar();
  43. le[++cnt]=3;fir[cnt]=check(ch);
  44. ch=getchar();sec[cnt]=check(ch);
  45. }
  46. scanf("%s",s+1);n=strlen(s+1);
  47. for(int i=1;i<=n;i++) f[i][i][check(s[i])]=1;
  48. for(int i=n-1;i>=1;i--)
  49. for(int j=i+1;j<=n;j++)
  50. for(int k=i;k<j;k++)
  51. for(int l=1;l<=cnt;l++)
  52. if(f[i][k][fir[l]]&&f[k+1][j][sec[l]])
  53. f[i][j][le[l]]=1;
  54. int flag=1;
  55. for(int i=0;i<4;i++)
  56. if(f[1][n][i]){
  57. flag=0;
  58. putchar(toalpha(i));
  59. }
  60. if(flag) printf("The name is wrong!");
  61. putchar('\n');
  62. return 0;
  63. }

2、[SCOI2009]粉刷匠

两次 \(dp\)

第一次 \(dp\) 出每一条木板粉刷 \(k\) 次最多能刷多少格子

第二次 \(dp\) 出最终答案,也就是把第一次 \(dp\) 的结果合并一下

\(Code\ Below:\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=50+10;
  4. int n,m,t,sum[maxn],f[maxn][maxn],dp[maxn][maxn*maxn];
  5. char a[maxn];
  6. int main()
  7. {
  8. scanf("%d%d%d",&n,&m,&t);
  9. for(int i=1;i<=n;i++){
  10. scanf("%s",a+1);
  11. memset(f,128,sizeof(f));
  12. for(int j=1;j<=m;j++) sum[j]=sum[j-1]+(a[j]=='1');
  13. for(int j=0;j<=m;j++) f[j][0]=0;
  14. for(int j=1;j<=m;j++)
  15. for(int x=0;x<m;x++)
  16. for(int k=1;k<=j;k++)
  17. f[j][k]=max(f[j][k],f[x][k-1]+max(sum[j]-sum[x],j-x-(sum[j]-sum[x])));
  18. for(int j=1;j<=t;j++){
  19. int limit=min(j,m);
  20. for(int k=0;k<=limit;k++)
  21. dp[i][j]=max(dp[i][j],dp[i-1][j-k]+f[m][k]);
  22. }
  23. }
  24. int ans=0;
  25. for(int i=1;i<=t;i++) ans=max(ans,dp[n][i]);
  26. printf("%d\n",ans);
  27. return 0;
  28. }

[学习笔记]区间dp的更多相关文章

  1. [学习笔记] 数位DP的dfs写法

    跟着洛谷日报走,算法习题全都有! 嗯,没错,这次我也是看了洛谷日报的第84期才学会这种算法的,也感谢Mathison大佬,素不相识,却写了一长篇文章来帮助我学习这个算法. 算法思路: 感觉dfs版的数 ...

  2. 算法笔记--区间dp

    1.石子归并问题 dp[i][j]表示区间i到j合并所需的最小花费. 先求出小区间的最小花费,再转移到大的区间. 转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1] ...

  3. 【学习笔记】dp基础

    知识储备:dp入门. 好了,完成了dp入门,我们可以做一些稍微不是那么裸的题了. dp基础,主要是做题,只有练习才能彻底掌握. 洛谷P1417 烹调方案 分析:由于时间的先后会对结果有影响,所以c[i ...

  4. [学习笔记]动态dp

    其实就过了模板. 感觉就是带修改的dp [模板]动态dp 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小 ...

  5. [学习笔记]整体DP

    问题: 有一些问题,通常见于二维的DP,另一维记录当前x的信息,但是这一维过大无法开下,O(nm)也无法通过. 但是如果发现,对于x,在第二维的一些区间内,取值都是相同的,并且这样的区间是有限个,就可 ...

  6. [学习笔记]树形dp

    最近几天学了一下树形\(dp\) 其实早就学过了 来提高一下打开树形\(dp\)的姿势. 1.没有上司的晚会 我的人生第一道树形\(dp\),其实就是两种情况: \(dp[i][1]\)表示第i个人来 ...

  7. [学习笔记]插头dp

    基于连通性的状压dp 巧妙之处:插头已经可以表示内部所有状态了. 就是讨论麻烦一些. 简介 转移方法:逐格转移,分类讨论 记录状态方法:最小表示法(每次要重新编号,对于一类没用“回路路径”之类的题,可 ...

  8. 【学习笔记】dp入门

    知识点 动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门.   先看看这段话 动态规划(dynamic programming) ...

  9. [BZOJ4011][HNOI2015] 落忆枫音(学习笔记) - 拓扑+DP

    其实就是贴一下防止自己忘了,毕竟看了题解才做出来 Orz PoPoQQQ 原文链接 Description 背景太长了 给定一个DAG,和一对点(x, y), 在DAG中由x到y连一条有向边,求生成树 ...

随机推荐

  1. Mvvm Light 无法添加MvvmView(Win81)的问题

    After I create a MvvmLight(Win81) project, I want add a new view , but there is only MvvmView(Win8), ...

  2. stm8 单线串口能收不能发

    原因是把连接的TX和RX短接了,其实在TX和RX间要串一个电阻,然后让stm8的单线TX接到RX.

  3. hdu 6208(后缀自动机、或者AC自动机

    题意:给你n个字符串,问你是否存在一个字符串可以从中找到其他n-1个字符串. 思路:其实很简单,找到最长的那个字符串对他进行匹配,看是否能匹配到n-1个字符串. 可以用AC自动机或者后缀自动机做,但是 ...

  4. 矩阵快速幂小结-Hdu2604

    矩阵快速幂可以想象为线性代数的矩阵相乘,主要是运用于高效的计算矩阵高次方. 将矩阵两两分组,若要求a^n,即知道a^(n/2)次方即可,矩阵快速幂便是运用的这个思路. 比方想求(A)^7那么(A)^6 ...

  5. 2018.10.25 uestc上天的卿学姐(计数dp)

    传送门 看了DZYODZYODZYO的题解之后发现自己又sbsbsb了啊. 直接dpdpdp是O(2d)O(2^d)O(2d)更新,O(1)O(1)O(1)查询或者O(1)O(1)O(1)更新,O(2 ...

  6. 修改oralce数据库用户名和密码

    首先以sys用户登录数据库 一.修改用户名 查到到所需修改用户名称的用户需要:select user#,name from user$;(例如查到有一个normal的用户对应的user#=61) 修改 ...

  7. openstack 租户、用户管理

    创建domain [root@cc01 ~]# openstack domain create --description "Default Domain" default +-- ...

  8. SVN previous operation has not finished

    svn提交遇到恶心的问题,可能是因为上次cleanup中断后,进入死循环了. 错误如下: 解决方法:清空svn的队列 1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.d ...

  9. 微信小程序与Vue js数据渲染对比

    //小程序 Page({ data: { items: [] }, onLoad: function(options) { this.setData({ items: [1,2,3] }) } }) ...

  10. ASP.NET 压缩输出的HTML字符

    重写Render using System; using System.Collections.Generic; using System.Text; using System.Web.UI; usi ...