博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ1563][NOI2009]诗人小G(决策单调性优化DP)
阅读量:4708 次
发布时间:2019-06-10

本文共 1575 字,大约阅读时间需要 5 分钟。

模板题。

每个决策点都有一个作用区间,后来的决策点可能会比先前的优。于是对于每个决策点二分到它会比谁在什么时候更优,得到新的决策点集合与区间。

1 #include
2 #include
3 #include
4 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 5 typedef long double ll; 6 using namespace std; 7 8 const int N=100010; 9 const ll MAX=1e18;10 int T,n,l,p,top;11 ll sm[N],f[N];12 char ch[N][35];13 struct P{ int l,r,p; }q[N];14 15 ll ksm(ll x){16 if (x<0) x=-x;17 ll res=1; rep(i,1,p) res*=x; return res;18 }19 20 ll cal(int j,int i){ return f[j]+ksm(sm[i]-sm[j]+(i-j-1)-l); }21 22 int find(P a,int b){23 int l=a.l,r=a.r;24 while (l<=r){25 int mid=(l+r)>>1;26 if (cal(a.p,mid)
q[st].r) st++;35 f[i]=cal(q[st].p,i);36 if (st>ed || cal(i,n)<=cal(q[ed].p,n)){37 while (st<=ed && cal(i,q[ed].l)<=cal(q[ed].p,q[ed].l)) ed--;38 if (st>ed) q[++ed]=(P){i,n,i};39 else{40 int t=find(q[ed],i);41 q[ed].r=t-1; q[++ed]=(P){t,n,i};42 }43 }44 }45 }46 47 int main(){48 freopen("bzoj1563.in","r",stdin);49 freopen("bzoj1563.out","w",stdout);50 for (scanf("%d",&T); T--; ){51 scanf("%d%d%d",&n,&l,&p);52 rep(i,1,n) scanf("%s",ch[i]);53 rep(i,1,n) sm[i]=sm[i-1]+strlen(ch[i]);54 DP();55 if (f[n]>MAX) printf("Too hard to arrange\n");56 else printf("%lld\n",(long long)(f[n]));57 puts("--------------------");58 }59 return 0;60 }

 

转载于:https://www.cnblogs.com/HocRiser/p/9833932.html

你可能感兴趣的文章
魔戒三曲,黑暗散去;人皇加冕,光明归来
查看>>
Error和Exception
查看>>
Python和Singleton (单件)模式[转载]
查看>>
httpclient设置proxy与proxyselector
查看>>
IT常用单词
查看>>
拓扑排序
查看>>
NYOJ--32--SEARCH--组合数
查看>>
gulpfile 压缩模板
查看>>
【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
查看>>
【 henuacm2016级暑期训练-动态规划专题 A 】Cards
查看>>
第五篇:白话tornado源码之褪去模板的外衣
查看>>
设备常用框架framework
查看>>
bootstrap模态框和select2合用时input无法获取焦点(转)
查看>>
MockObject
查看>>
BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
查看>>
查看手机已经记住的WIFI密码
查看>>
最新版IntelliJ IDEA2019 破解教程(2019.08.07-情人节更新)
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
adb shell am 的用法
查看>>