acm第10次區間dp 做題新知識

2021-09-17 21:44:17 字數 1314 閱讀 1797

最近好像也沒有什麼好寫的,區間dp上次寫了點,周一的時候老師又講了,所以在此補充點新的理解吧,然後最後附上做題是自己不知道的新知識

一、區間dp

1、基礎**

①、當求最小dp時

//一般區間dp實現**

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

//初始化dp

//0x3f在此表示乙個很大很大的值

for (int i = 1; i <= n; i++) //區間長度為1的初始化

dp[i][i] = 0;

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

}②、求最大dp時

//一般區間dp實現**

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

//初始化dp

//賦值給最小值

for (int i = 1; i <= n; i++) //區間長度為1的初始化

dp[i][i] = 0;

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

}2、三種模型

①老師以石子問題為例的類似模型

規定dp[i][j]為合併第i堆到第j堆的最小花費 dp方程為: dp[i][j] = min(dp[i][k] + dp[k+1][j]) + sum[j] - sum[i-1] (i <= k < j)

②老師以括號匹配問題為例

第二種模型就是根據匹配資訊把區間劃分成[i+1,k-1]和[k+1,j]

劃分為倆個區間

③類似字串的問題模型

這種比較簡單,不需要列舉區間k∈[i,j],這種型別只和左右邊界相關。

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

dp[i][i] = 0;

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

for(int i = 1, j = len; j <= m; i++, j++)

}printf("%d\n", dp[1][m]);

return 0;

}二、做題新知識

1、有一道結果輸出時間的題,不會輸出那個格式,所以找了一下

printf("%02d:%02d:%02d am\n", h, m, s);中%02d什麼意思?

解:輸出格式、寬度問題!如果整數不夠2位就補上0

比如:printf("%02d" ,3);

結果就是

03如果大於等於2沒有影響

printf("%02d",1234);

1234

2、while(1)無限迴圈

Week12 作業選做題(區間dp,狀壓dp)

406簡化一下題意 要找由 四個字元組成的字串的最長子序列,這個子串行必須滿足,所有的括號裡都不能包含單數個另一種括號的一邊 這一邊無法再匹配到另一半 那麼,這道題就成為了區間dp的典型題。剛開始遍歷左右括號之間距離為0的情況,再遍歷距離為1,2 n的情況。按順序從左到右遍歷,根據狀態轉移方程 j ...

第10次作業

clerk.getproduct 從店員處取走整數 class producer implements runnable public void run catch interruptedexception e clerk.setproduct product 將產品交給店員 public clas...

第10次作業

1.用迴圈機構求字串長度。include main char cs 20 int i 0,lenght 0 gets cs puts cs while cs i 0 lenght printf 字串的長度為 d n lenght 2.編寫程式,統計字串中大寫字母的個數。include main ch...