4565: [Haoi2016]字符合并
2018-03-27 12:18
423 查看
题目链接
题目大意:有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数。得到的新字
符和分数由这 k 个字符确定。你需要求出你能获得的最大分数
题解:区间+状压dp
细节见此
我的收获:23333
题目大意:有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数。得到的新字
符和分数由这 k 个字符确定。你需要求出你能获得的最大分数
题解:区间+状压dp
细节见此
我的收获:23333
#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define N 305 #define ll long long int n,k; int c[259],w[259]; ll f [259],INF; char str ; inline void up(ll &x,ll y){x=x>y?x:y;} void work() { for(int l=2;l<=n;l++) for(int i=1;i<=n-l+1;i++) { int j=i+l-1,len=j-i; while(len>=k) len-=k-1; for(int m=j;m>i;m-=k-1) for(int S=0;S<(1<<len);S++) if(f[i][m-1][S]!=INF){ if(f[m][j][0]!=INF) up(f[i][j][S<<1],f[i][m-1][S]+f[m][j][0]); if(f[m][j][1]!=INF) up(f[i][j][S<<1|1],f[i][m-1][S]+f[m][j][1]); } if(len==k-1) { ll g[2];g[0]=g[1]=INF; for(int S=0;S<(1<<k);S++) if(f ab19 [i][j][S]!=INF) g[c[S]]=max(g[c[S]],f[i][j][S]+w[S]); f[i][j][0]=g[0];f[i][j][1]=g[1]; } } cout<<*max_element(f[1] ,f[1] +(1<<k))<<endl; } void init() { scanf("%d%d%s",&n,&k,str+1); for(int i=0;i<(1<<k);i++) scanf("%d%d",&c[i],&w[i]); memset(f,128,sizeof(f));INF=f[0][0][0]; for(int i=1;i<=n;i++) f[i][i][str[i]-'0']=0; } int main() { init(); work(); return 0; }
相关文章推荐
- BZOJ4565 HAOI2016字符合并(区间dp+状压dp)
- 4565: [Haoi2016]字符合并 区间DP
- [BZOJ 4565][HAOI 2016] 字符合并 状压DP+区间DP
- 【BZOJ 4565】 [Haoi2016]字符合并 区间dp+状压
- 【BZOJ】4565: [Haoi2016]字符合并
- 【BZOJ4565】【HAOI2016】字符合并 [状压DP][区间DP]
- bzoj4565 [Haoi2016]字符合并 (区间DP + 状压DP)
- BZOJ 4565 [Haoi2016] 字符合并
- [BZOJ4565] [Haoi2016] 字符合并
- 【HAOI2016】bzoj4565 字符合并
- bzoj4565【HAOI2016】字符合并
- [BZOJ4565][Haoi2016]字符合并(状压dp)
- bzoj4565 [HAOI2016]字符合并 结论+状压+区间dp
- bzoj 4565: [Haoi2016]字符合并 (字符串dp)
- bzoj 4565: [Haoi2016]字符合并
- 【BZOJ4565】【状压DP】【区间DP】[Haoi2016]字符合并 题解
- 4565: [Haoi2016]字符合并
- BZOJ4565: [Haoi2016]字符合并
- 区间+状压 [Haoi2016]字符合并
- BZOJ 4566 [Haoi2016]找相同字符 后缀数组+ST表