區間dp學習筆記

2022-02-24 16:53:35 字數 1763 閱讀 6770

怎麼辦,膜你賽要掛慘了,下午我還在學區間\(dp\)!

不管怎麼樣,計畫不能打亂\(4\)不\(4\)。。

為啥我一開始就先弄模板呢?因為這東西看模板就能看懂。。。

for(int i=2;i<=len;i++)//列舉區間長度

{ for(int l=1,r=l+len-1;r<=n;l++,r++)//列舉左端點和右端點

{ //以下你可以搞一下事情

for(int k=l;k以上就是區間dp的大體模板,至於為啥,感性理解一下就好了

為啥我一開始就弄加強版呢?因為普通版就在加強版裡面哇\(qwq\)

傳送門這道題目是說乙個環形操場,然後合併成一堆的最大值最小值

注意加粗的字型,環形操場?

好吧,這就是乙個環形\(dp\),通常的就是複製一遍,斷環為鏈,別問我為啥是這樣

然後就是狀態轉移方程。\(dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r])\)與\(dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r])\)

**#include#include#include#include#includeusing namespace std;

const int n = 1000;

int n,a[1000],dpmax[n][n],dpmin[n][n],sum[n];

int main()

{ scanf("%d",&n);

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

scanf("%d",&a[i]),a[i+n]=a[i];

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

sum[i]=sum[i-1]+a[i];

memset(dpmin,0x3f,sizeof(dpmin));

for(int i=1; i<=n*2; i++)dpmin[i][i]=0;

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

{for(int l=1,r=len+l-1; r<=n*2; l++,r++)

{for(int k=l; k傳送門

這道題也是\(dp\)問題,不算特別的裸,畢竟用到了字串。

因為我們要判斷括號的合法性,所以我們在列舉左端點和右端點的時候,只要合法,括號序列就\(+2\),也就是\(dp[l][r]=dp[l+1][r-1]+2\)

這個看不懂的人不多吧

#include#include#include#include#includeusing namespace std;

char s[255];

int dp[300][300];

int main()

{ while(1)

{ cin >> s+1;

if(s[1]=='e')break;

memset(dp,0,sizeof(dp));

int len=strlen(s+1);

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

{ for(int l=1,r=i+l-1; r<=len; l++,r++)

{if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))

dp[l][r]=dp[l+1][r-1]+2;

for(int k=l; k關於區間\(dp\)還有乙個東西叫做四邊形不等式優化,\(emmm\)這東西以後再學

區間dp學習筆記

定義 區間動態規劃問題一般都是考慮,對於每段區間,他們的最優值都是由幾段更小區間的最優值得到,是分治思想的一種應用,將乙個區間問題不斷劃分為更小的區間直至乙個元素組成的區間,列舉他們的組合 求合併後的最優值。設f i,j 1 i j n 表示區間 i,j 內的數字相加的最小代價最小區間f i,i 0...

學習筆記 區間dp

f l r w i n g 表示區間 l,r 中能否壓縮成 w i n g code below include using namespace std const int maxn 200 10 int n,w,i,n,g,le maxn fir maxn sec maxn f maxn maxn...

區間DP學習筆記

顧名思義 區間dp就是在區間上進行動態規劃,求解一段區間上的最優解。主要是通過合併小區間的 最優解進而得出整個大區間上最優解的dp演算法。題目描述給出乙個長度為n的字串,每次可以刪除乙個字母相同的子串,問最少需要刪多少次。資料規模 n 500 輸入格式第1行 1個整數,表示字串的長度 第2行 n個字...