bzoj 1563 詩人小G 決策單調性優化dp

2021-09-26 16:20:00 字數 2178 閱讀 4884

bzoj上這道題是許可權題,然鵝我沒許可權

acwing上有:

對於普通的dp方程,很快可以寫出:

設句子長度的字首和為sum陣列,句子長度陣列為a陣列

dp[i]:以句子i結尾的最小不協調度 , len :標準長度

但很明顯這樣的時間複雜度是o(n^2) ,過不了

可以用決策單調性來優化dp

決策單調性的前提需要滿足四邊形不等式。

決策單調性大概就是假如dp[i]以dp[j]為最優決策更新**,則對於所有x>i,dp[x]的最優決策**》=j

先(粗略)的證明一下可以使用決策單調性。

先對式子變一下型,相同的湊一起:

則需要證明:

觀察val的形態,決定讓i相同的項相同的湊一起

式子變形:

展開,設val(i+1,j) = x   val(i,j)= y

因為x>y,所以只需要證明

在t>0的地方單調遞增(ps:我上面的式子好像漏寫了絕對值符號qaq)

對其求導:

很明顯當p,t,c都大於0的時候式子大於0.

因為我使用的是優先佇列,所以還不需要二分尋找

而具體過程大概為:

使用(loc,l,r) 表示 l,r  區間的最優決策**dp[j] 的下標j=loc

一開始先插入(0,1,n),然後for(int i=1;i<=n;i++)進行遍歷

對於每一次遍歷:

1.先排除過時決策,排除佇列左端(loc,i,j) 中j2.試取佇列左端作為dp[i]的最優選擇

3.取出隊尾,記為(locr,lr,rr),然後以dp[i]更新決策,具體表現為:

if以dp[i]更新lr優於以dp[locr]來更新,那麼最右邊的決策就不要了

else if以dp[i]更新rr優於以dp[locr]來更新,就(看**,感覺不好說明。。)

else 二分查詢lr,rr,找出乙個點w使得小於w部分以dp[locr]更新更好,大於等於w部分以dp[i]來更新更好,然後修改rr=w-1

然後插入新決策

**:

#includeusing namespace std;

const int maxn = 1e5 + 7;

#define ld long double

int n, len, p;

int sum[maxn];

ld dp[maxn];

const ld ed = 1e18;

struct node q[maxn];

ld calc(int i, int j)

void insert(int i, int& l, int& r)

}q[r].r = ll - 1;

flag = ll;

}break;

} }if (flag != -1)

}int main()

int q_l = 1, q_r = 0;

q[++q_r].l = 1;

q[q_r].r = n;

q[q_r].loc = 0;

for (int i = 1; i <= n; i++)

if (dp[n] > ed)

else

cout << "--------------------" << endl;

} return 0;

}

BZOJ 1563 四邊形不等式

對於每組資料,若最小的不協調度不超過1018,則第一行乙個數表示不協調度若最小的不協調度超過1018,則輸出 too hard to arrange 不包含引號 每個輸出後面加 44 9 3 brysj,hhrhl.yqqlm,gsycl.4 9 2 brysj,hhrhl.yqqlm,gsycl....

BZOJ1563 詩人小G(1d1d動態規劃)

小g是乙個出色的詩人,經常作詩自娛自樂。但是,他一直被一件事情所困擾,那就是詩的排版問題。一首詩包含了若干個句子,對於一些連續的短句,可以將它們用空格隔開並放在一行中,注意一行中可以放的句子數目是沒有限制的。小g給每首詩定義了乙個行標準長度 行的長度為一行中符號的總個數 他希望排版後每行的長度都和行...

P1563 玩具謎題

題目描述 小南有一套可愛的玩具小人,它們各有不同的職業。有一天,這些玩具小人把小南的眼鏡藏了起來。小南發現玩具小人們圍成了乙個圈,它們有的面朝圈內,有的面朝圈外。如下圖 這時singersinger告訴小南乙個謎題 眼鏡藏在我左數第3個玩具小人的右數第11個玩具小人的左數第22個玩具小人那裡。小南發...