斜率優化dp小結

2021-08-04 02:29:30 字數 1448 閱讀 3233

最近刷了幾道斜率優化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 的最小值,然後...