šš 375. ēę°åå¤§å° II
2022幓10ę10ę„
- algorithm
šš 375. ēę°åå¤§å° II
é¾åŗ¦: šš
é®é¢ęčæ°
č§£ę³
class Solution {
public int getMoneyAmount(int n) {
// ęč·Æļ¼
// dp[i][j] = max(dp[i][k], dp[k + 1][j]) åęę k ę
åµäøē min
int[][] dp = new int[n + 1][n + 1];
for(int i = 0; i <= n; i ++) {
Arrays.fill(dp[i], -1);
}
// dp
for(int i = n; i >= 0; i --) { // i == 0 ę¶ dp[0][j] === 0 ę²”ęä»»ä½čæēØä¼ēØå°å ę¤å¼äøŗä»»ä½å¼åę å½±å
for(int j = i; j <= n; j ++) {
if(i == j) {
dp[i][j] = 0;
} else if(i == j - 1) {
dp[i][j] = i; // ēč¾å¤§ēę°ļ¼ēäøäøč¾é±ļ¼äøäøéč¦ä»č¾å°ę°åƹåŗēå
} else {
// č³å° 3 äøŖå¼
// åč®¾å½åéäø kļ¼č„ęē«Æę
åµäø k ę²”ęēäøļ¼ęøøęä¼åē„å¾åŖäøŖę¹åčµ°ļ¼å ę¤éč¦ē”®äæäøč®ŗåŖäøŖę¹åę¬éä»č¶³å¤
for(int k = i; k <= j; k ++) {
int tmp = k; // åå§ę
åµäøéč¦ä»åŗēäøäøē代价
if(k > i) {
tmp += dp[i][k - 1];
}
if(k + 1 <= j) {
// å¤ęęÆå¦åę ·äøŗ k > i
if(k > i && dp[i][k - 1] < dp[k + 1][j]) {
tmp = tmp - dp[i][k - 1] + dp[k + 1][j]; // äæēå³čē¹
} else if(k <= i) {
tmp += dp[k + 1][j];
}
}
if(dp[i][j] == -1) {
dp[i][j] = tmp;
} else {
dp[i][j] = Math.min(dp[i][j], tmp);
}
}
}
// System.out.println(i + ":" + j + " " + dp[i][j]);
}
}
return dp[1][n];
}
}