当前位置: 首页 > news >正文

P3736 [HAOI2016] 字符合并 - Link

题意

有一个长度为 \(n\)\(01\) 串,你可以每次将相邻的 \(k\) 个字符合并,获得一定价值。
给出所有长度为 \(k\) 的串串被合并所获得的价值以及得到的新字符,问把原串缩完能获得的最大价值。
\(n\le300,k\le8\)

思路

\(f_{i,j,s}\) 表示把 \([i,j]\) 的字符缩成 \(s\) 的最大价值(要缩到最短)。转移的时候枚举分界点 \(k\)\(k\) 左边的状态 \(s\),并保证 \(k\) 右边只会缩成一个点,这样是不会漏的,那么 \(f_{l,r,s\times2+t}=max(f_{l,k,s}+f_{k+1,r,t})\) 其中 \(t\in\set{0,1}\)。如果当前区间缩完长度只剩 \(1\),那么需要特殊处理,因为按照上面的转移式处理会把当前区间缩成长度 \(k\)

代码

// Problem: P3736 [HAOI2016] 字符合并
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3736
// Memory Limit: 250 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>inline void read(T&x){x=0;char c=getchar();bool f=0;while(!isdigit(c)) c=='-'?f=1:0,c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;}template<typename T>inline void write(T x){if(x==0){putchar('0');return ;}x<0?x=-x,putchar('-'):0;short st[50],top=0;while(x) st[++top]=x%10,x/=10;while(top) putchar(st[top--]+'0');}inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}inline void write(char c){putchar(c);}inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
#define LL long long
const int maxn=310,maxk=10,maxzt=300;
int n,k,w[maxzt],c[maxzt],a[maxn];
LL f[maxn][maxn][maxzt];
signed main(){read(n,k);for(int i=1;i<=n;i++) read(a[i]);for(int i=0;i<(1<<k);i++) read(c[i],w[i]);memset(f,-0x3f,sizeof(f));for(int i=1;i<=n;i++) f[i][i][a[i]]=0;for(int len=1;len<=n;len++) for(int l=1;l<=n;l++){int r=l+len;if(r>n) break;int sy=len%(k-1);if(sy==0) sy=k-1;for(int w=r-1;w>=l;w-=k-1) for(int s=0;s<(1<<sy);s++){f[l][r][s<<1]=max(f[l][r][s<<1],f[l][w][s]+f[w+1][r][0]);f[l][r][s<<1|1]=max(f[l][r][s<<1|1],f[l][w][s]+f[w+1][r][1]);}if(sy+1==k){LL g[2]={0,0};for(int s=0;s<(1<<sy+1);s++) g[c[s]]=max(g[c[s]],f[l][r][s]+w[s]);memset(f[l][r],-0x3f,sizeof(f[l][r]));f[l][r][0]=g[0],f[l][r][1]=g[1];}}LL ans=0;for(int i=0;i<(1<<k);i++) ans=max(ans,f[1][n][i]);write(ans);return 0;
}
http://www.jsqmd.com/news/720928/

相关文章:

  • 别再死记硬背了!用Arduino和ESP32的ADC,5分钟搞懂模数转换到底怎么‘转’的
  • 想买智能鱼缸有哪些品牌
  • OO第二单元博客
  • ESP-IDF+vscode开发ESP32第九讲——I2S工程1
  • 开源数据备份实战:如何高效永久保存微信聊天记录
  • 终极免费Switch模拟器Ryujinx:5分钟快速上手指南
  • 2026年3月网带生产商推荐,不锈钢链板/非标链条/平顶链板/金属网带/滚筒输送机/爬坡输送机,网带制造企业如何选 - 品牌推荐师
  • 论文降AI选错工具会怎样?从90%降到4%中间踩了哪些坑全公开! - 我要发一区
  • 终极Windows更新修复指南:如何用Reset Windows Update Tool快速解决更新问题
  • 如何实现微信聊天记录永久保存:WeChatMsg技术解析与应用指南
  • 【App Service】查看Application Insights自身SDK日志的方法示例
  • 如何掌握Undecimus的5个高效调试技巧:从问题诊断到完美解决
  • 2026最权威的六大AI写作助手推荐
  • geopanda库GIS地理分析
  • 2026年厦门专升本公司最新TOP实力排行:专升本辅导中心/专升本培训辅导班/专升本考试培训班升本/专升 - 品牌策略师
  • 20240429
  • 跟着 MDN 学 HTML day_3:(表单CSS美化实战与盒子模型三大核心属性详解)
  • 保姆级教程:用MQTT.fx 1.7.1连接OneNET平台,从设备创建到数据收发全流程
  • Winhance:你的Windows性能加速器,3大核心功能让电脑重获新生
  • 研途从容落笔,Paperxie 智能撰写赋能毕业论文全阶创作
  • P4592 [TJOI2018] 异或 - Link
  • 20254121 2025-2026-2 《Python程序设计》实验3报告
  • 开源色彩管理革命:OpenColorIO配置为ACES的终极指南
  • 别再只抄代码了!手把手教你用逻辑分析仪调试STM32与DS1302的SPI时序
  • LongWayToGo
  • 终极风扇控制指南:告别噪音与过热的专业解决方案
  • 成都二手上下铁床供应商|十年工厂,员工宿舍高低床/工地双层床/可定制 - 企业推荐师
  • 降AI怎么花钱才不冤枉?按学校要求+预算4种情况分类推荐工具! - 我要发一区
  • 萌宝成长助手,轻松带娃
  • 嘎嘎降的1000字免费试用够不够看出效果?万字论文实测拆解! - 我要发一区