最近刷了幾道斜率優化dp算是對斜率優化有了一定的了解了
現在來小結一下
斜率優化dp的優化能力是將n^2優化成n,n^3優化成n^2
其轉移方程一般是dp[k]=min(dp[i]+cost[i+1][k]),斜率優化優化的是排除一些不可能是最優解的解,那麼什麼情況下不可能是最優解呢
下面看一道題hdu 2829
狀態轉移方程是dp[i][j]=min(dp[k][j-1]+cost[k+1][i])
那麼k2比k1更優的情況是
dp[k1][j-1]+cost[k1+1][i]>dp[k2][j-1]+cost[k2+1][i]
我們發現cost[k+1][i]=cost[1][i]-cost[1][k]-sum[k]*(sum[i]-sum[k])
那麼我們帶進去化簡就可以得到
dp[k1][j-1]-cost[1][k1]+sum[k1]*sum[k1]-sum[k1]*sum[i]>dp[k2][j-1]-cost[1][k2]+sum[k2]*sum[k2]-sum[k2]*sum[i]
那麼我們設
y1=dp[k1][j-1]-cost[1][k1]+sum[k1]*sum[k1]
y2=dp[k2][j-1]-cost[1][k2]+sum[k2]*sum[k2]
x1=sum[k1],x2=sum[k2]
所以k2比k1更優的條件是
y2-y1<(x2-x1)*sum[i]
如果等於那就是一樣優,那就也是可以刪掉k1的那麼我們可以在條件上加乙個=號
也就是(y2-y1)<=(x2-x1)*sum[i]
假設我有三個數k1,k2,k3, k1那麼k2永遠都不會是最優的情況是
(y3-y2)/(x3-x2)<(y2-y1)/(x2-x1)
我們分類討論一下如果對於sum[i]來說
如果(y3-y2)/(x3-x2)<=sum[i]那麼k3比k2優或者一樣優,那麼都是可以刪掉的
如果(y3-y2)/(x3-x2)>sum[i],此時(y2-y1)/(x2-x1)>sum[i]那麼k1比k2優
#include #include #include #include #define maxn 1500
using namespace std;
int sum[maxn],dp[maxn][maxn],cost[maxn];
int que[maxn];
int dp(int n,int m)//初始化完成
int head,tail;
for (int j=1;j<=m;j++)
}return dp[n][m];
}int main()
printf("%d\n",dp(n,m));
}return 0;
}
斜率優化dp小結
在寫斜率優化之前,我們來回顧一下單調佇列優化的dp 1.對於如下形式的dp方程 dp i min 0 j我們直接用乙個變數維護 0,i 中dp j f j 的最小值即可 2.對於如下形式的dp方程 dp i min i m j我們可以用乙個單調佇列維護乙個 i m,j 中dp j f j 的最小值,...
斜率優化dp小結
先推薦一篇部落格 下文有小部分修改自 有些dp方程可以轉化成dp i f i,j x i 的形式,其中f j 與i和j有關。這樣的dp方程無法直接使用單調佇列進行優化,所以考慮另外一中降低複雜度的方式 斜率優化!舉個例題 hdu 3507 設dp i 表示到i的最少花費,sum i 表示從a 1 到...
斜率優化dp小結
在寫斜率優化之前,我們來回顧一下單調佇列優化的dp 1.對於如下形式的dp方程 dp i min 0 我們直接用乙個變數維護 0,i 中dp j f j 的最小值即可 2.對於如下形式的dp方程 dp i min i m 我們可以用乙個單調佇列維護乙個 i m,j 中dp j f j 的最小值,然後...