對於每組資料,若最小的不協調度不超過1018,則第一行乙個數表示不協調度若最小的不協調度超過1018,則輸出"too hard to arrange"(不包含引號)。每個輸出後面加"--------------------"
44 9 3
brysj,
hhrhl.
yqqlm,
gsycl.
4 9 2
brysj,
hhrhl.
yqqlm,
gsycl.
1 1005 6
poet
1 1004 6
poet
108--------------------
32--------------------
too hard to arrange
--------------------
1000000000000000000
--------------------
【樣例說明】
前兩組輸入資料中每行的實際長度均為6,後兩組輸入資料每行的實際長度均為4。乙個排版方案中每行相鄰兩個句子之間的空格也算在這行的長度中(可參見樣例中第二組資料)。每行末尾沒有空格。
總共10個測試點,資料範圍滿足:
測試點 t n l p
1 ≤10 ≤18 ≤100 ≤5
2 ≤10 ≤2000 ≤60000 ≤10
3 ≤10 ≤2000 ≤60000 ≤10
4 ≤5 ≤100000 ≤200 ≤10
5 ≤5 ≤100000 ≤200 ≤10
6 ≤5 ≤100000 ≤3000000 2
7 ≤5 ≤100000 ≤3000000 2
8 ≤5 ≤100000 ≤3000000 ≤10
9 ≤5 ≤100000 ≤3000000 ≤10
10 ≤5 ≤100000 ≤3000000 ≤10
所有測試點中均滿足句子長度不超過30。
四邊形不等式優化dp使用條件:
若dp[i] = min(dp[j] + val(i, j)), 如果val(i, j)滿足(val(i, j) + val(i + 1, j + 1) <= val(i, j + 1) + val(i + 1, j),即val滿足四邊形不等式,則該dp方程滿足決策單調性。
即對每乙個dp[i],其轉移過來的位置p[i]序列有單調性。
利用決策單調性,將複雜度降低至nlogn。
具體操作:
建乙個元素為(x, l, r)(表示l ~ r之間的dp值最優決策都是由位置x處轉移)的佇列。
(1) 每次更新檢查隊頭的r是否為i - 1,如果是,踢掉;否則更新隊頭的l值為i;
(2)直接取隊頭的x值更新dp[i],即dp[i] = dp[x] + val(i, x);
接下來要維護隊尾滿足決策單調
(3)如果隊尾的l, x滿足dp[x] + val(l, x) > dp[i] + val(l, i) 踢掉; 不斷重複此操作
(4)在隊尾的區間內二分得到最小的ans(預設r + 1),使得dp[i] + val(ans, i) < dp[x] + val(ans, x);
(5)更改隊尾r為ans - 1;隊尾加入(i, ans, n)
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #includeview code8 #include 9 #include 10 #include 11 #include 12 #include 13 #include
14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21
22using
namespace
std;
2324
#define pau system("pause")
25#define ll long long
26#define pii pair27
#define pb push_back
28#define mp make_pair
29#define mp make_pair
30#define pli pair31
32const
double pi = acos(-1.0
);33
const
int inf = 0x3f3f3f3f;34
const
int mod = 1e9 + 7;35
const
double eps = 1e-9;36
37/*
38#include
39#include
40using namespace __gnu_pbds;
41#define tree, rb_tree_tag, tree_order_statistics_node_update> tree
42tree t;
43*/
4445
const
int m = 1018;46
int t, n, l, p, a[100015], sum[100015
];47
long
double dp[100015
];48
struct
gg 51 gg (int x, int l, int
r) : x(x), l(l), r(r) {}
52 } g[100015
];53
intql, qr;
54char s[35
];55
long
double val(int i, int
j) 58
intmain()
67 g[ql = qr = 1] = gg(0, 1
, n);
68for (int i = 1; i <= n; ++i)
79int s = g[qr].l, e = g[qr].r, ans = e + 1
, mi;
80 j =g[qr].x;
81while (s <=e)
86 g[qr].r = ans - 1;87
if (ans <= n) g[++qr] =gg(i, ans, n);88}
89if (dp[n] <=1e18) else
94 puts("
--------------------");
95}96return0;
97 }
四邊形不等式
總結一下最近幾天對dp優化中的四邊形不等式的學習。證明什麼的似懂非懂,我還是太年輕了。第一種,n 2 nlogn 例題 由於許可權問題 不公開題面 就是1個體積均為1 300,100000個物品,做乙個100000的揹包。發現體積最多只有 300 種,分開做。對於同種體積的物品,顯然按照價值從大到小...
四邊形不等式
若有函式 a i,j 令 i,若有 a i j a i 1 j 1 le a i j 1 a i 1 j 則我們稱函式 a 滿足四邊形不等式。若我們在 dp 過程中會用到類似如下形式的方程 dp i j min dp k j or dp i k dp k 1 j w i j 那麼,只要代價函式 w ...
四邊形不等式相關
四邊形不等式,即 w i j w i j w i j w i j 其中 i i j j 順便推薦兩篇 四邊形不等式 動態規劃演算法優化技巧 我是這麼總結的 1 狀態轉移方程形如 f i opt 其中b i j i 1 說明 b i 是根據題目描述的可以決策狀態i的左邊界,w j i 是狀態j轉移到狀...