C# 背包记忆化搜索 代码
public class Solution {
public int PaintWalls(int[] cost, int[] time) {
int n = cost.Length, INF = 0x3f3f3f3f;
int[,] cache = new int[n, n + 1];
for (int i = 0; i < n; i++){
for (int j = 0; j <= n; j++){
cache[i, j] = -1;
}
}
return DFS(n - 1, n);
int DFS(int i, int j){
if (j <= 0) return 0;
if (i < 0) return INF;
if (cache[i, j] != -1) return cache[i, j];
cache[i, j] = Math.Min(DFS(i - 1, j - time[i] - 1) + cost[i], DFS(i - 1, j));
return cache[i, j];
}
}
}
C# 背包二维DP 代码
public class Solution {
public int PaintWalls(int[] cost, int[] time) {
int n = cost.Length, INF = 0x3f3f3f3f;
int[,] dp = new int[n + 1, n + 1];
for (int i = 0; i <= n; i++){
for (int j = 1; j <= n; j++){
dp[i, j] = INF;
}
}
for (int i = 1; i <= n; i++){
for (int j = 0; j <= n; j++){
int t = j - time[i - 1] - 1;
dp[i, j] = Math.Min(dp[i - 1, Math.Max(t, 0)] + cost[i - 1], dp[i - 1, j]);
}
}
return dp[n, n];
}
}
C# 背包DP优化 代码
public class Solution {
public int PaintWalls(int[] cost, int[] time) {
int n = cost.Length, INF = 0x3f3f3f3f;
int[] dp = new int[n + 1];
Array.Fill(dp, INF);
dp[0] = 0;
for (int i = 1; i <= n; i++){
for (int j = n; j >= 0; j--){
int t = j - time[i - 1] - 1;
dp[j] = Math.Min(dp[Math.Max(t, 0)] + cost[i - 1], dp[j]);
}
}
return dp[n];
}
}
C# 记忆化搜索 代码
public class Solution {
public int PaintWalls(int[] cost, int[] time) {
int n = cost.Length, m = n * 2;
int INF = 0x3f3f3f3f;
int[,] cache = new int[n, m];
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
cache[i, j] = -1;
}
}
return DFS(n - 1, n);
int DFS(int i, int j){
if (j - n > i) return 0;
if (i < 0) return INF;
if (cache[i, j] != -1) return cache[i, j];
cache[i, j] = Math.Min(DFS(i - 1, j + time[i]) + cost[i], DFS(i - 1, j - 1));
return cache[i, j];
}
}
}