P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】
正题
题目链接:https://www.luogu.com.cn/problem/P5319
题目大意
一个长度为nnn的串TTT,用0∼90\sim 90∼9填充所有的...。
然后给出mmm个串和它们的价值。
一个填充方案的价值等于:若TTT中出现了ccc个给出的串,那价值等于它们的价值乘积开ccc次根。
1≤m≤1501,1≤Vi≤1091\leq m\leq 1501,1\leq V_i\leq 10^91≤m≤1501,1≤Vi≤109
解题思路
ans=∏Vicans=\sqrt[c]{\prod V_i}ans=c∏Vi
lnans=1c∑(lnVi)\ln ans=\frac{1}{c}\sum (\ln V_i)lnans=c1∑(lnVi)
然后就是一个0/10/10/1分数规划问题了,因为要匹配,所以要先跑一个ACACAC自动机上dpdpdp就好了。
时间复杂度O(n2log109)O(n^2\log 10^9)O(n2log109)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int N=1510;
const double eps=1e-6;
int n,m,cnt,ch[N][10],fail[N],num[N];
double w[N],v[N],f[N][N];
pair<int,int>pre[N][N];queue<int> q;
char T[N],S[N];
void Insert(char *s,double val){int l=strlen(s),x=0;for(int i=0;i<l;i++){int c=s[i]-'0';if(!ch[x][c])ch[x][c]=++cnt;x=ch[x][c];}v[x]+=val;num[x]++;return;
}
void Build(){for(int i=0;i<10;i++)if(ch[0][i])q.push(ch[0][i]);while(!q.empty()){int x=q.front();q.pop();v[x]+=v[fail[x]];num[x]+=num[fail[x]];for(int i=0;i<10;i++){if(!ch[x][i])ch[x][i]=ch[fail[x]][i];else{fail[ch[x][i]]=ch[fail[x]][i];q.push(ch[x][i]);}}}return;
}
int check(double mid){for(int i=0;i<=cnt;i++)w[i]=v[i]-mid*num[i];for(int i=0;i<=n;i++)for(int j=0;j<=cnt;j++)f[i][j]=-1e100;f[0][0]=0;for(int i=1;i<=n;i++){for(int j=0;j<=cnt;j++){if(f[i-1][j]<=-1e99)continue;if(T[i]=='.'){for(int k=0;k<10;k++){int y=ch[j][k];if(f[i][y]<f[i-1][j]+w[y])f[i][y]=f[i-1][j]+w[y],pre[i][y].first=j,pre[i][y].second=k;}}else{int k=T[i]-'0',y=ch[j][k];if(f[i][y]<f[i-1][j]+w[y])f[i][y]=f[i-1][j]+w[y],pre[i][y].first=j,pre[i][y].second=k;}}}int root=0;for(int j=0;j<=cnt;j++)if(f[n][j]>f[n][root])root=j;return root;
}
void print(int k,int x){if(k<1)return; print(k-1,pre[k][x].first);printf("%d",pre[k][x].second);return;
}
int main()
{scanf("%d%d",&n,&m);scanf("%s",T+1);for(int i=1;i<=m;i++){int x;scanf("%s",S);scanf("%d",&x);Insert(S,log(x));}Build();double l=0,r=21;while(r-l>eps){double mid=(l+r)/2.0;int root=check(mid);if(f[n][root]>eps)l=mid;else r=mid;}int root=check(l);print(n,root);return 0;
}
P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】相关推荐
- [BJOI2019]奥术神杖(分数规划+AC自动机+DP)
题解:很显然可以对权值取对数,然后把几何平均值转为算术平均值,然后很显然是分数规划.先对每个模式串建立AC自动机,每个节点w[i],sz[i]分别表示以其为前缀的字符串,然后再二分最优解k,然后w[i ...
- jzoj4017-逃跑【0/1分数规划,线段树,dp】
正题 题目链接:https://jzoj.net/senior/#contest/show/3011/2 题目大意 n+1n+1n+1个连续的地方,每个地方有(a,b,c)(a,b,c)(a,b,c) ...
- [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...
- bzoj 3232 圈地游戏——0/1分数规划(或网络流)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...
- jzoj3852-单词接龙【0/1分数规划,负环】
正题 题目链接:https://jzoj.net/senior/#main/show/3852 题目大意 nnn个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...
- [学习笔记]0/1分数规划
对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...
- #0/1分数规划,SPFA,负环#洛谷 1768 天路
题目链接 分析 可以发现,这是一道0/1分数规划的题目,需要二分答案,然后判定是否存在负环,所以说bfs貌似不高效,那就用dfs吧,若二分答案为0,即不合法 代码 #include <cstdi ...
- 转载二分 01 分数规划即最大化平均值的证明0/1分数规划、最优比率生成树、最优比率环
首页 新随笔 联系 管理 订阅 随笔- 20 文章- 0 评论- 9 [Algorithm]01分数规划--Update:2012年7月27日 [关键字] 0/1分数规划.最优比率生成树.最优比率 ...
- 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...
最新文章
- java spring scope_如何在Spring中自定义scope的方法示例
- 服务应该去版本化,不管是微服务还是SOA
- 编程5年了,养成的臭脾气
- java 模拟登陆exe_Java简单模拟登陆和爬虫实例---博客园老牛大讲堂
- python集合数据对象_python学习第七天 基础数据类型补充 深浅copy 集合 关键字后面加可迭代对象...
- Ubuntu中设置环境变量PATH
- MySQL innodb load data.vs.insert 前因后果
- 怎么修改x轴_Origin绘图:共X轴Stack绘制分波态密度与绘图中的科学构思
- 5G 已来,是否意味着 4G 淘汰?
- 2022-10-10 Android 在其他应用上的悬浮窗View
- 入门OJ:photo
- 伪原创文章生成器-自媒体洗稿工具-关键词文章生成工具免费
- 数学-线性代数:线性代数
- 巴比特 | 元宇宙每日必读:红杉中国“雇”了一位虚拟员工,自称每秒可看百份商业计划书,期待时薪为0.68元...
- matlab 合并fig文件,Matlab合并多个.fig文件
- 微信oauth MySQL_微信OAuth2网页授权登陆接口PHP实例下载
- Xbox One Dance Central Spotlight 歌曲列表
- 苹果摄像头黑屏_报道称苹果已将折叠 iPhone 送往测试/苹果官网上线送份好礼,送到心里页面/iPhone 12 mini 拆解报告公布...
- 跨期套利的四大核心逻辑
- 使用shell比较两个文本的差异
热门文章
- python版本差异_python的版本的差别 2,3
- 计算机技术级生活中的应用,人工智能技术在计算机中的发展与应用
- php 电压 异常,tv断线警告是什么原因
- php实现电脑自动关机,用批处理实现电脑自动关机
- html 输入框自动缩短 一行内显示,JQuery UI组合框自动补全功能改进版(即时全部显示+input内容保存)...
- 计算机安全模型研究与应用,软件哨兵安全动态检测模型的研究与实现-计算机应用研究.PDF...
- drbd heartbeat mysql_Heartbeat+DRBD+MySQL Replication故障处理
- java 中符号_谁能告诉我java中符号的用法,见代码
- activex java 控件_java 如何调用ActiveX控件??
- [Spring5]IOC容器_Bean管理XML方式_自动装配