最近好像也沒有什麼好寫的,區間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...