總結一下最近幾天對dp優化中的四邊形不等式的學習。
證明什麼的似懂非懂,我還是太年輕了。
第一種, n^2 -> nlogn
例題: (由於許可權問題 不公開題面)
就是1個體積均為1-300,100000個物品,做乙個100000的揹包。
發現體積最多只有 300 種,分開做。對於同種體積的物品,顯然按照價值從大到小取最優。
我們假設 s=1,設狀態 f[i]為大小為 i的揹包的最大收益。
轉移函式 f[i]=max(f[ i-j ]+sum(a[1..j]))
是乙個 f[x]=min的經典模型
w滿足大區間大於等於小區間的性質,
且當 a於是 決策有單調性 ,假如用
k(x)
表示狀態
x 取到最優值時的決策 , k(x) 是不降的。
注意到給定兩個決策點,我們是可以通過二分計算出令他們大小關係反轉的時間點 t 的。
於是就可以維護乙個單調棧,進行二分。
對於其他的 s,發現只有在狀態模 s 同余時單調性才成立,所以對於每一種體積 s,按照剩餘類的順序依次做即可。
時間複雜度 o(maxs*k+n)
code :
#includeusing namespace std;
typedef long long ll;
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i)
template void chmin(t &x,const t &y)
template void chmax(t &x,const t &y)
#define mid (l+r>>1)
int erfen()
int main()
dp[0][0]=0;
for(s=1;s<=300;++s)
top=0;
for(int i=t[s];i;i=l[i].next) q[++top]=l[i].v;
sort(q+1,q+top+1,greater() );
rep(i,1,top)val[i]=val[i-1]+q[i];
rep(i,top+1,m)val[i]=0;
for(d=0;dtail)
else
if(you(st[tail],mi))
dp[s][i*s+d]=get(st[head],i);
}} }
rep(i,1,m)printf("%lld ",dp[300][i]);
}
第二種:n^3-> n^2
(1)區間包含的單調性:如果對於i≤i'(2)四邊形不等式:如果對於i≤i'下面給出兩個定理
定理一:如果上述的w函式同時滿足區間包含單調性和四邊形不等式性質,那麼函式m也滿足四邊形不等式性質。
我們再定義s(i,j)表示m(i,j)取得最優值時對應的下標(即i≤k≤j時,k處的w值最大,則s(i,j)=k)。此時有如下定理
定理二:假如m(i,j)滿足四邊形不等式,那麼s(i,j)單調,即s(i,j)≤s(i,j+1)≤s(i+1,j+1)。
例題: poj1160
code
#include#include#define maxd 310
#define maxp 40
#define inf 0x3f3f3f3f
int n, p, f[maxd][maxd], a[maxd], a[maxd], k[maxd][maxd];
void init()
}int getw(int x, int y)
void solve()
for(p = 1; p <= n - p; p ++)}}
printf("%d\n", f[p][n]);
}int main()
return 0;
}
本來無法理解三重迴圈為何n^2,後來模擬了一遍,
從小區間推向大區間即從dp方陣的每條對角線(好吧不是對角線 就是表達那個意思)從中間向兩邊轉移,
,每條對角線的轉移時o(n)的,然後有o(n)條對角線,於是就o(n^2)了,太神了%%%。
四邊形不等式
若有函式 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轉移到狀...
DP 四邊形不等式
by qw 關於四邊形不等式或石子合併的資料。網上有很多。但有不少都是語焉不詳,直接拋給你幾個結論,讓人很難理解。這篇文章將以石子合併為例。證明關於四邊形不等式的一些結論。算是乙個溫習。題面 在乙個操場上擺放著一排n n 20 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成...