4565: [Haoi2016]字符合并
来源:互联网 发布:ip广播软件 编辑:程序博客网 时间:2024/06/05 00:50
4565: [Haoi2016]字符合并
Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 154 Solved: 70
[Submit][Status][Discuss]
Description
有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数。得到的新字
符和分数由这 k 个字符确定。你需要求出你能获得的最大分数。
Input
第一行两个整数n,k。接下来一行长度为n的01串,表示初始串。接下来2k行,每行一个字符ci和一个整数wi,ci
表示长度为k的01串连成二进制后按从小到大顺序得到的第i种合并方案得到的新字符,wi表示对应的第i种方案对应
获得的分数。1<=n<=300,0<=ci<=1,wi>=1,k<=8
Output
输出一个整数表示答案
Sample Input
3 2
101
1 10
1 10
0 20
1 30
101
1 10
1 10
0 20
1 30
Sample Output
40
//第3行到第6行表示长度为2的4种01串合并方案。00->1,得10分,01->1得10分,10->0得20分,11->1得30分。
//第3行到第6行表示长度为2的4种01串合并方案。00->1,得10分,01->1得10分,10->0得20分,11->1得30分。
HINT
Source
#include<iostream>#include<cstdio>#include<cstring>using namespace std; const int maxn = 303;typedef long long LL;const LL INF = 1E12; LL val[maxn],f[maxn][maxn][maxn];int n,k,s[maxn],t[maxn];char ch[maxn]; void Pre_Work(){ cin >> n >> k; scanf("%s",ch + 1); for (int i = 1; i <= n; i++) s[i] = ch[i] - '0'; for (int i = 0; i < (1<<k); i++) scanf("%d%lld",&t[i],&val[i]); for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++) for (int op = 0,K = (1<<k); op < K; op++) f[i][j][op] = -INF;} int main(){ #ifdef DMC freopen("DMC.txt","r",stdin); #endif Pre_Work(); for (int i = n; i; i--) for (int j = i; j <= n; j++) { if (i == j) {f[i][j][s[i]] = 0; continue;} int le = ((j - i) % (k-1) == 0)?k - 1:(j - i) % (k - 1); for (int mid = j; mid > i; mid -= (k - 1)) for (int op = 0,K = (1<<le); op < K; op++) for (int o = 0; o < 2; o++) f[i][j][op<<1|o] = max(f[i][j][op<<1|o],f[i][mid-1][op] + f[mid][j][o]); if (le == k - 1) { LL g[2]; g[0] = g[1] = -INF; for (int op = 0,K = (1<<k); op < K; op++) g[t[op]] = max(g[t[op]],f[i][j][op] + val[op]); for (int op = 0; op < 2; op++) f[i][j][op] = g[op]; } } LL Ans = 0; for (int op = 0,K = (1<<k); op < K; op++) Ans = max(Ans,f[1][n][op]); cout << Ans; return 0;}
0 0
- 4565: [Haoi2016]字符合并
- BZOJ 4565 [Haoi2016] 字符合并
- bzoj 4565: [Haoi2016]字符合并
- 4565: [Haoi2016]字符合并 区间DP
- bzoj4565【HAOI2016】字符合并
- 【HAOI2016】bzoj4565 字符合并
- BZOJ4565: [Haoi2016]字符合并
- 区间+状压 [Haoi2016]字符合并
- bzoj 4565: [Haoi2016]字符合并 (字符串dp)
- [BZOJ4565][Haoi2016]字符合并(状压dp)
- BZOJ4565: [Haoi2016]字符合并(区间DP+状压DP)
- bzoj4565 [Haoi2016]字符合并 (区间DP + 状压DP)
- 【BZOJ4565】【状压DP】【区间DP】[Haoi2016]字符合并 题解
- BZOJ4566 [Haoi2016]找相同字符
- [bzoj4566][HAOI2016]找相同字符
- 【bzoj4566】[Haoi2016]找相同字符
- bzoj4566【HAOI2016】找相同字符
- 4566: [Haoi2016]找相同字符
- php中的单列模式
- 欢迎使用CSDN-markdown编辑器
- mysql巧用正则表达式
- 【Nutch】InjectorJob
- HDU 1013 Digital Roots 大数 水题
- 4565: [Haoi2016]字符合并
- Android和Unity混合开发——Activity和Unity脚本交互和信息传递
- Yii2 之 富文本编辑器
- Android最实用TextView文字逐个打出效果
- Python Email
- WPF的ComboBox实现可过滤显示下拉内容
- javaapplet还有用吗
- angular js ng-route 路由简单实例
- 剑指offer——面试题26:复杂链表的复制