區間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...