區間dp入門

2021-09-21 18:16:02 字數 1791 閱讀 9803

區間dp入門

}hdu3506 (實質是環形石子合併)

題目鏈結

將前n - 1塊石子複製到後面,構成長度為2*n-1的陣列,按照之前的區間dp思路遞推。

原思路三層迴圈時間複雜度為o(n^3),需要加入四邊形優化,減少對k的遍歷降低複雜度,不然過不了。

四邊形優化講解

#includeusing namespace std;

typedef long long ll;

const int maxn = 2010;

const int inf = 0x3f3f3f3f;

int a[maxn];

int dp[maxn][maxn];

int sum[maxn]; //不同於基礎的石子合併,此處sum陣列為一維,時間空間複雜度都更好

int p[maxn][maxn];

int n;

int main()

for(int w = 2; w <= n; w++)}}

}int ans = dp[1][n];

for(int i = 2; i <= n; i++)

cout << ans << endl;

}return 0;

}

bribe the prisoner

挑戰白皮區間dp例題

dp版本:

#include#include#include#includeusing namespace std;

const int maxn = 110;

const int inf = 0x3f3f3f3f;

int dp[maxn][maxn];

int p, q, a[maxn];

int main()

}printf("%d\n", dp[0][q + 1]);

return 0;

}

dfs版本(更好理解)

#include#include#include#includeusing namespace std;

const int maxn = 110;

const int inf = 0x3f3f3f3f;

int dp[maxn][maxn];

int p, q, a[maxn];

int calc(int a, int b)

int solve(int l, int r)

return dp[l][r];

}int main()

區間DP入門

區間dp,看名字其實會聯想到劃分dp,其實兩者的關係並不大。劃分dp是從頭到尾劃分解決,並且有劃分數量,而區間dp沒有這些限制條件,可以從任意區間開始,一直擴大到整個區間。不斷遞推求解。同樣也是分兩步去做。首先 還是進行資料處理,比如用陣列sum i j 去儲存i到j的和,或者是用別的方式處理並儲存...

區間DP入門

今天學長給我們講了區間dp,當然聽得雲裡霧裡,講完之後基本處於自閉狀態,然後還是自己到大佬的部落格,然後看部落格,但是並沒有找到很詳細的部落格,所以我想自己寫一寫,大神們勿噴哈.一 定義 區間dp,顧名思義是在區間上dp,它的主要思想就是先在小區間進行dp得到最優解,然後再利用小區間的最優解合併求大...

區間dp入門

區間dp就是區間上的dp,先算出小區間的最優解,再由小區間合併推出大區間的最優解。include include include includeusing namespace std const int inf 0x3f3f3f3f const int maxn 1010 int n int a m...