1. 程式人生 > >BZOJ 1563: [NOI2009]詩人小G 決策單調性DP

BZOJ 1563: [NOI2009]詩人小G 決策單調性DP

題目大意:給定若干個字串,可以將相鄰的若干個字串連線起來並在其中插入空格,最小化每個字串與給定長度的差的絕對值的p次方。
題解:一眼看上去像是之前做過的斜率優化,但是仔細一看不是平方變成了p次方,這就是斜率優化做不了的了,查了題解才知道這是決策單調性DP,決策單調性DP就是假如有如下方程:F[i]=max(f[j]+W(i,j))其中W(i,j)是有關i,j的式子,若能證明W(i+1,j)+W(i,j+1)>= W(i,j)+ W(i+1,j+1) 則有對於任意i<=j 一定有i的決策點小於等於j的決策點,實際做題的時候不推薦證明,可以先寫出個暴力來看決策點單調行,反正最後也要對拍233,知道了這個性質以後我們就可以用一個棧並二分找到每個狀態能夠更新的狀態從哪開始,從而在nlogn的時間複雜度內解決問題。我們現在來看這道題,我們可以很方便的列出DP方程:F[i]=max(F[j]+|sum[j]-sum[i]+j-i+1-L|^P)至於為什麼滿足四邊形不等式這裡就不證明了(我不會233,那麼接下來就是模板時間了233。因為數字太大,所以我們用double存,快速冪的時候要寫成“慢速冪”,否則會GG。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef long double ld;
long long limit=1000000000000000000ll;
ld ksm(ld x,int t)
{
    long
double re=1; for(int i=1;i<=t;i++) re*=x; return re; } ld sum[200000]; ld f[200000]; int stack[200000]; int top; int g[200000]; int P,n,L; ld F(int i,int j) { return f[j]+ksm(fabs(sum[i]-sum[j]+(i-j-1)-L),P); } int get_pos(int x) { int l=1,r=top; int jilu=-1; while(l<=r) { int
mid=l+r>>1; if(g[stack[mid]]<=x) jilu=mid,l=mid+1; else r=mid-1; } return stack[jilu]; } int erfen(int k) { int l=max(g[stack[top]]-1,k)+1; int r=n; int j=stack[top]; int jilu=n+1; while(l<=r) { int mid=l+r>>1; if(F(mid,j)>F(mid,k)) jilu=mid,r=mid-1; else l=mid+1; } return jilu; } char s[50]; int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&L,&P); for(int i=1;i<=n;i++) { scanf("%s",s+1); sum[i]=sum[i-1]+strlen(s+1); } f[0]=0; g[0]=1; stack[top=1]=0; for(int i=1;i<=n;i++) { int pos=get_pos(i); f[i]=F(i,pos); while(i<g[stack[top]] && F(g[stack[top]],stack[top])>F(g[stack[top]],i)) stack[top--]=0; pos=erfen(i); if(pos!=n+1) { stack[++top]=i; g[i]=pos; } } if(f[n]-0.5>limit) puts("Too hard to arrange"),puts("--------------------"); else printf("%lld\n--------------------\n",(long long) (f[n]+0.5)); } return 0; }

相關推薦

bzoj 1563 [NOI2009]詩人G 決策調性+dp

ref bit std online mes pac c++ () include 題面 題目傳送門 解法 可以得到一個顯然的dp方程 $\(f_i=min(f_j+(s_i-s_j+i-j-1-L)^p)\) 不妨把後面的東西看成\(w(j,i)\) 所以就變成\(f_i

BZOJ 1563: [NOI2009]詩人G 決策調性DP

題目大意:給定若干個字串,可以將相鄰的若干個字串連線起來並在其中插入空格,最小化每個字串與給定長度的差的絕對值的p次方。 題解:一眼看上去像是之前做過的斜率優化,但是仔細一看不是平方變成了p次方,這就

bzoj1563: [NOI2009]詩人G 決策調性(1D1D)

單調性 .com const cst 方程 algorithm tdi com stp 目錄 題目鏈接 題解 代碼 題目鏈接 bzoj1563: [NOI2009]詩人小G 題解 \(n^2\)dp長這樣 \(f_i = min(f_j + (sum_i - sum

bzoj 1563: [NOI2009]詩人G

四邊形不等式,黑書講的很詳細,但其中有一些小錯誤==… f[j]=min(f[i]+(sum[j]-sum[i]+(j-i-1)-T)^P)) 首先我們要證明 w(i,j)=(sum[j]-sum[

BZOJ_1563_[NOI2009]詩人G_決策調性

esp con algo pri 技術分享 r++ div 方案 句子 BZOJ_1563_[NOI2009]詩人小G_決策單調性 Description Input Output 對於每組數據,若最小的不協調度不超過1018,則第一行一個數表示不協調度若最

1563: [NOI2009]詩人G

div \n tps nbsp 一個點 sea fin () node 1563: [NOI2009]詩人小G https://lydsy.com/JudgeOnline/problem.php?id=1563 分析:   直接轉移f[i]=f[j]+cost(i,j

[NOI2009]詩人Gdp + 決策調性優化)

題意 有一個長度為 \(n\) 的序列 \(A\) 和常數 \(L, P\) ,你需要將它分成若干段,每 \(P\) 一段的代價為 \(| \sum ( A_i ) − L|^P\) ,求最小代價的劃分方案。 \(n \le 10^5 , 1 \le P \le 10\) 題解 考慮暴力 \(O(n^2)\)

決策調性的動態規劃】noi2009詩人G

關於決策單調性在網上有一篇非常好的論文----<1D1D動態規劃優化初步>. O(N^2)的演算法想必大家一定秒出了,可以發現這道題所用的方程是個經典1D1D方程:f[i]=min{f[j]+cost[i,j]}; 那麼我們的任務就是證明決策單調性在直接套用模板

[NOI2009]詩人G決策調性優化dp

【題解】 經典的1D1D動態規劃優化  狀態轉移方程:f[i]=min{ f[j]+abs(s[i]-s[j]+i-j-1-l)^p }  決策單調性及證明: http://blog.csdn.net/jasonzhu8/article/details/5928552 因此

bzoj 2216 [Poi2011]Lightning Conductor 決策調性+dp

pre inline 假設 int efi 當前 www. 記錄 sin 題面 題目傳送門 解法 決策單調性比較經典的題吧 題目就是要對於每一個\(i\)求\(f_i=max(a_j-a_i+\sqrt{|i-j|}))\) 可以發現,\(\sqrt n\)的增長速度比較慢

決策調性DP學習小記

四邊形不等式 解決形如這樣的DP式子的問題 F i

Codeforces Round #190 (Div. 1): E. Ciel and Gondolas(決策調性DP+wqs二分)

題意: 同一道題目,但是bzoj可能需要讀入掛 思路: wqs二分 沒什麼可講的了 #include<stdio.h> #include<string.h> #include<algorithm>

bzoj2216 [Poi2011]Lightning Conductor(決策調性DP

bzoj2216 [Poi2011]Lightning Conductor 題意: 已知一個長度為n的序列a1,a2,…,an。 對於每個1<=i<=n,找到最小的非負整數p滿足

[BZOJ3549]-[ONTAK2010]Tower / [BZOJ1233]-[Usaco2009Open]乾草堆tower-性質+決策調性dp

說在前面 並沒有什麼想說的,但是要保持格式=w= 題目 題面 給定 NN 個積木,編號為 1⋯N1⋯N,每個積木高度為 11,寬度為 wiwi,你可以把若干個積木放在一層上,堆成若干層,要求滿足兩個條件: 對於任意一層的積木,他的寬度

【BZOJ1563】【NOI2009詩人Gdp+決策調性

Description Input Output 對於每組資料,若最小的不協排程不超過1018,則第一行一個數表示不協排程若最小的不協排程超過1018,則輸出”Too hard to arrange”(不包含引號)。每個輸出後面加”——————–”

BZOJ 1563】 (四邊形優化、決策調性

1563: [NOI2009]詩人小G Time Limit: 100 Sec  Memory Limit: 64 MBSubmit: 2611  Solved: 840 Description Input Output 對於每組資料,若最小的不協排程不超過1018,則第一行一個數表示不協排程若最小的不

BZOJ1563/洛谷P1912 詩人G 【四邊形不等式優化dp

set har 方案 zoj #define 證明 isp 現在 fine 題目鏈接 洛谷P1912【原題,需輸出方案】 BZOJ1563【無SPJ,只需輸出結果】 題解 四邊形不等式 什麽是四邊形不等式? 一個定義域在整數上的函數\(val(i,j)\),滿足對\(\fo

BZOJ5125 Q的書架(決策調性+動態規劃+分治+樹狀數組)

zoj esp 基礎 out 決策單調 註意 spa void get   設f[i][j]為前i個劃成j段的最小代價,枚舉上個劃分點轉移。容易想到這個dp有決策單調性,感性證明一下比較顯然。如果用單調棧維護決策就不太能快速的求出逆序對個數了,改為使用分治,移動端點時樹狀數

【總結】從詩人GDP的四邊形不等式優化

四邊形不等式 設w(x,y)w(x,y)w(x,y)是定義在整數集合上的二元函式。若對於定義域上的任何整數,a,b,c,d(a≤b≤c≤d)a,b,c,d(a\leq b\leq c\leq d)a

[BZOJ5125]Q的書架(決策調性+分治DP+樹狀陣列)

顯然有決策單調性,但由於逆序對不容易計算,考慮分治DP。 solve(k,x,y,l,r)表示當前需要選j段,待更新的位置為[l,r],這些位置的可能決策點區間為[x,y]。暴力計算出(l+r)/2的決策位置s,兩邊遞迴下去繼續操作。solve(k,x,s,l,mid-1),solve(k,s,y,mid+