正题

题目链接: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​​
ln⁡ans=1c∑(ln⁡Vi)\ln ans=\frac{1}{c}\sum (\ln V_i)lnans=c1​∑(lnVi​)
然后就是一个0/10/10/1分数规划问题了,因为要匹配,所以要先跑一个ACACAC自动机上dpdpdp就好了。

时间复杂度O(n2log⁡109)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】相关推荐

  1. [BJOI2019]奥术神杖(分数规划+AC自动机+DP)

    题解:很显然可以对权值取对数,然后把几何平均值转为算术平均值,然后很显然是分数规划.先对每个模式串建立AC自动机,每个节点w[i],sz[i]分别表示以其为前缀的字符串,然后再二分最优解k,然后w[i ...

  2. 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) ...

  3. [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案

    题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...

  4. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  5. jzoj3852-单词接龙【0/1分数规划,负环】

    正题 题目链接:https://jzoj.net/senior/#main/show/3852 题目大意 nnn个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...

  6. [学习笔记]0/1分数规划

    对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...

  7. #0/1分数规划,SPFA,负环#洛谷 1768 天路

    题目链接 分析 可以发现,这是一道0/1分数规划的题目,需要二分答案,然后判定是否存在负环,所以说bfs貌似不高效,那就用dfs吧,若二分答案为0,即不合法 代码 #include <cstdi ...

  8. 转载二分 01 分数规划即最大化平均值的证明0/1分数规划、最优比率生成树、最优比率环

    首页 新随笔 联系 管理 订阅 随笔- 20  文章- 0  评论- 9 [Algorithm]01分数规划--Update:2012年7月27日 [关键字] 0/1分数规划.最优比率生成树.最优比率 ...

  9. 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

    题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...

最新文章

  1. java spring scope_如何在Spring中自定义scope的方法示例
  2. 服务应该去版本化,不管是微服务还是SOA
  3. 编程5年了,养成的臭脾气
  4. java 模拟登陆exe_Java简单模拟登陆和爬虫实例---博客园老牛大讲堂
  5. python集合数据对象_python学习第七天 基础数据类型补充 深浅copy 集合 关键字后面加可迭代对象...
  6. Ubuntu中设置环境变量PATH
  7. MySQL innodb load data.vs.insert 前因后果
  8. 怎么修改x轴_Origin绘图:共X轴Stack绘制分波态密度与绘图中的科学构思
  9. 5G 已来,是否意味着 4G 淘汰?
  10. 2022-10-10 Android 在其他应用上的悬浮窗View
  11. 入门OJ:photo
  12. 伪原创文章生成器-自媒体洗稿工具-关键词文章生成工具免费
  13. 数学-线性代数:线性代数
  14. 巴比特 | 元宇宙每日必读:红杉中国“雇”了一位虚拟员工,自称每秒可看百份商业计划书,期待时薪为0.68元...
  15. matlab 合并fig文件,Matlab合并多个.fig文件
  16. 微信oauth MySQL_微信OAuth2网页授权登陆接口PHP实例下载
  17. Xbox One Dance Central Spotlight 歌曲列表
  18. 苹果摄像头黑屏_报道称苹果已将折叠 iPhone 送往测试/苹果官网上线送份好礼,送到心里页面/iPhone 12 mini 拆解报告公布...
  19. 跨期套利的四大核心逻辑
  20. 使用shell比较两个文本的差异

热门文章

  1. python版本差异_python的版本的差别 2,3
  2. 计算机技术级生活中的应用,人工智能技术在计算机中的发展与应用
  3. php 电压 异常,tv断线警告是什么原因
  4. php实现电脑自动关机,用批处理实现电脑自动关机
  5. html 输入框自动缩短 一行内显示,JQuery UI组合框自动补全功能改进版(即时全部显示+input内容保存)...
  6. 计算机安全模型研究与应用,软件哨兵安全动态检测模型的研究与实现-计算机应用研究.PDF...
  7. drbd heartbeat mysql_Heartbeat+DRBD+MySQL Replication故障处理
  8. java 中符号_谁能告诉我java中符号的用法,见代码
  9. activex java 控件_java 如何调用ActiveX控件??
  10. [Spring5]IOC容器_Bean管理XML方式_自动装配