[学习笔记]区间dp
区间 \(dp\)
1、[HAOI2008]玩具取名
\(f[l][r][W/I/N/G]\) 表示区间 \([l,r]\) 中能否压缩成 \(W/I/N/G\)
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=200+10;
int n,W,I,N,G,le[maxn],fir[maxn],sec[maxn],f[maxn][maxn][4],cnt;
char s[maxn];
int check(char ch){
if(ch=='W') return 0;
if(ch=='I') return 1;
if(ch=='N') return 2;
return 3;
}
char toalpha(int i){
if(i==0) return 'W';
if(i==1) return 'I';
if(i==2) return 'N';
return 'G';
}
int main()
{
scanf("%d%d%d%d",&W,&I,&N,&G);
char ch;
for(int i=1;i<=W;i++){
ch=getchar();
while(!isalpha(ch)) ch=getchar();
le[++cnt]=0;fir[cnt]=check(ch);
ch=getchar();sec[cnt]=check(ch);
}
for(int i=1;i<=I;i++){
ch=getchar();
while(!isalpha(ch)) ch=getchar();
le[++cnt]=1;fir[cnt]=check(ch);
ch=getchar();sec[cnt]=check(ch);
}
for(int i=1;i<=N;i++){
ch=getchar();
while(!isalpha(ch)) ch=getchar();
le[++cnt]=2;fir[cnt]=check(ch);
ch=getchar();sec[cnt]=check(ch);
}
for(int i=1;i<=G;i++){
ch=getchar();
while(!isalpha(ch)) ch=getchar();
le[++cnt]=3;fir[cnt]=check(ch);
ch=getchar();sec[cnt]=check(ch);
}
scanf("%s",s+1);n=strlen(s+1);
for(int i=1;i<=n;i++) f[i][i][check(s[i])]=1;
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
for(int k=i;k<j;k++)
for(int l=1;l<=cnt;l++)
if(f[i][k][fir[l]]&&f[k+1][j][sec[l]])
f[i][j][le[l]]=1;
int flag=1;
for(int i=0;i<4;i++)
if(f[1][n][i]){
flag=0;
putchar(toalpha(i));
}
if(flag) printf("The name is wrong!");
putchar('\n');
return 0;
}
2、[SCOI2009]粉刷匠
两次 \(dp\)
第一次 \(dp\) 出每一条木板粉刷 \(k\) 次最多能刷多少格子
第二次 \(dp\) 出最终答案,也就是把第一次 \(dp\) 的结果合并一下
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=50+10;
int n,m,t,sum[maxn],f[maxn][maxn],dp[maxn][maxn*maxn];
char a[maxn];
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++){
scanf("%s",a+1);
memset(f,128,sizeof(f));
for(int j=1;j<=m;j++) sum[j]=sum[j-1]+(a[j]=='1');
for(int j=0;j<=m;j++) f[j][0]=0;
for(int j=1;j<=m;j++)
for(int x=0;x<m;x++)
for(int k=1;k<=j;k++)
f[j][k]=max(f[j][k],f[x][k-1]+max(sum[j]-sum[x],j-x-(sum[j]-sum[x])));
for(int j=1;j<=t;j++){
int limit=min(j,m);
for(int k=0;k<=limit;k++)
dp[i][j]=max(dp[i][j],dp[i-1][j-k]+f[m][k]);
}
}
int ans=0;
for(int i=1;i<=t;i++) ans=max(ans,dp[n][i]);
printf("%d\n",ans);
return 0;
}
[学习笔记]区间dp的更多相关文章
- [学习笔记] 数位DP的dfs写法
跟着洛谷日报走,算法习题全都有! 嗯,没错,这次我也是看了洛谷日报的第84期才学会这种算法的,也感谢Mathison大佬,素不相识,却写了一长篇文章来帮助我学习这个算法. 算法思路: 感觉dfs版的数 ...
- 算法笔记--区间dp
1.石子归并问题 dp[i][j]表示区间i到j合并所需的最小花费. 先求出小区间的最小花费,再转移到大的区间. 转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1] ...
- 【学习笔记】dp基础
知识储备:dp入门. 好了,完成了dp入门,我们可以做一些稍微不是那么裸的题了. dp基础,主要是做题,只有练习才能彻底掌握. 洛谷P1417 烹调方案 分析:由于时间的先后会对结果有影响,所以c[i ...
- [学习笔记]动态dp
其实就过了模板. 感觉就是带修改的dp [模板]动态dp 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小 ...
- [学习笔记]整体DP
问题: 有一些问题,通常见于二维的DP,另一维记录当前x的信息,但是这一维过大无法开下,O(nm)也无法通过. 但是如果发现,对于x,在第二维的一些区间内,取值都是相同的,并且这样的区间是有限个,就可 ...
- [学习笔记]树形dp
最近几天学了一下树形\(dp\) 其实早就学过了 来提高一下打开树形\(dp\)的姿势. 1.没有上司的晚会 我的人生第一道树形\(dp\),其实就是两种情况: \(dp[i][1]\)表示第i个人来 ...
- [学习笔记]插头dp
基于连通性的状压dp 巧妙之处:插头已经可以表示内部所有状态了. 就是讨论麻烦一些. 简介 转移方法:逐格转移,分类讨论 记录状态方法:最小表示法(每次要重新编号,对于一类没用“回路路径”之类的题,可 ...
- 【学习笔记】dp入门
知识点 动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门. 先看看这段话 动态规划(dynamic programming) ...
- [BZOJ4011][HNOI2015] 落忆枫音(学习笔记) - 拓扑+DP
其实就是贴一下防止自己忘了,毕竟看了题解才做出来 Orz PoPoQQQ 原文链接 Description 背景太长了 给定一个DAG,和一对点(x, y), 在DAG中由x到y连一条有向边,求生成树 ...
随机推荐
- 【NIFI】 Apache NiFI 与 SQL 操作
本里需要基础知识:[NIFI] Apache NiFI 安装及简单的使用 查询SQL 1.拖入一个 Processor:ExecuteSQLRecord(执行sql记录) 2.配置,SETTINGS的 ...
- How to turn on syntax highlighting in osx
put follow code in ~/.vimrc set ai " auto indenting set history=100 " keep 100 lines of hi ...
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- The XOR Largest Pair(Tire字典树应用)
题目链接:传送门 思路:建立一个32位的字典树,对每一个要插入的数字查找它异或的最大值(就是尽量全部二进制的值都相反), 然后获得两个数异或的最大值. #include<iostream> ...
- SQL MAP 注入测试
SQL MAP是一款测试系统是否有SQL漏洞的工具 下载地址: http://sqlmap.org/ sqlmap 是一款使用python编写的工具,所以需要安装python,需要安装python 为 ...
- confluence5.65+CentOS+mysql安装破解
以atlassian-confluence-5.6.5为例 先安装JAVA环境 通过yum安装jdk,5.6.5不支持jdk1.8,所以安装1.7或者1.6都可以 ...
- vba遗传算法之非一致性突变
http://www.docin.com/p-959323141-f4.html Sub 非一致性变异() Dim totalGenerate As Integer, currentGenerate ...
- javascript总结集合
前言:下面的总结都是自己测试过的,绝大多数都是没问题的,但是不敢保证一定全面,还需要诸君自己独立思考: 1)基础:在nodejs里全局对象是global,而网页里js的全局对象是window:对于所有 ...
- js格式化文件大小, 输出成带单位的字符串工具
/** * 格式化文件大小, 输出成带单位的字符串 * @method formatSize * @grammar formatSize( size ) => String * @grammar ...
- 20155326 第五周加分题--mybash的实现
第五周加分题--mybash的实现 题目要求 1.使用fork,exec,wait实现mybash 2.写出伪代码,产品代码和测试代码 3.发表知识理解,实现过程和问题解决的博客(包含代码托管链接) ...