4565: [Haoi2016]字符合并 区间DP
2016-05-21 23:43
246 查看
令fi,j,k表示区间[i,j]合并成k的最大收益,其中K=0/1保证[i,j]可以合并成一个数。
转移的时候用gj,k表示对于当前的i,[i,j]合并成了k,其中k是一个二进制数。
然后转移一下就行了
转移的时候用gj,k表示对于当前的i,[i,j]合并成了k,其中k是一个二进制数。
然后转移一下就行了
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=305; int n,m; int a ,c ,w ; long long f [2],g ,tmp[2],ans ; char s ; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { n=read(); m=read(); memset(f,-1,sizeof(f)); scanf("%s",s+1); for (int i=1;i<=n;i++) f[i][i][s[i]-'0']=0; for (int i=0;i<1<<m;i++) c[i]=read(),w[i]=read(); for (int i=n-m+1;i;i--) { memset(g,-1,sizeof(g)); int now=1; g[i][0]=f[i][i][0]; g[i][1]=f[i][i][1]; for (int j=i+1;j<=n;j++) { for (int s=0;s<1<<now;s++) if (g[j-1][s]>=0) for (int k=j;k<=n;k+=m-1) { if (f[j][k][0]>=0) g[k][s<<1]=max(g[k][s<<1],g[j-1][s]+f[j][k][0]); if (f[j][k][1]>=0) g[k][s<<1|1]=max(g[k][s<<1|1],g[j-1][s]+f[j][k][1]); } if (++now==m) { memset(tmp,-1,sizeof(tmp)); for (int s=0;s<1<<m;s++) if (g[j][s]>=0) tmp[c[s]]=max(tmp[c[s]],w[s]+g[j][s]); f[i][j][0]=g[j][0]=tmp[0]; f[i][j][1]=g[j][1]=tmp[1]; now=1; } } } for (int i=1;i<=n;i++) for (int j=i;j<=n;j+=m-1) ans[j]=max(ans[j],ans[i-1]+max(f[i][j][0],f[i][j][1])); cout << ans << endl; return 0; }
相关文章推荐
- 深入浅出UML类图---写得不错,备忘
- 学习经历之格式篇
- leetcode #20 in cpp
- 人生四然:来是偶然,去是必然,尽其当然,顺其自然!
- findreplace Matlab 脚本
- 一道JAVA面试题(匿名内部类)
- 软件设计----LisKov替换原则(LSP)
- 4566: [Haoi2016]找相同字符 广义后缀自动机
- Learning Handler
- 1001
- AIX 6.1 11g RAC数据库怎样改网段
- --pl/sql包,游标,存储过程,块
- 内存溢出及Jvm监控工具
- Hadoop学习18--yarn配置篇-基本配置节点
- redis 编译报错 CC:not find 和 error: jemalloc/jemalloc.h: No such file or directory
- 为什么苹果的利润不会受HTML5影响?
- 263. Ugly Number
- 大数的运算
- SDUT1130数据结构上机测试1:顺序表的应用
- c文件操作 (转)