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個玩具小人那裡。小南發...