hdu 4283
地址:http://acm.hdu.edu.cn/showproblem.php?pid=4283
题意:一些人排好序,然后先进黑屋子,然后再出来去舞台,黑屋子是相当于一个栈,先进后出,每个人去舞台都有一个不开心值,求不开心值最小的做法。
mark:记忆化搜索。
代码:
#include <cstdio> #include <cstring> #include <cstdlib> int min(int a, int b) {return a < b ? a : b;} const int INF = 10000000; int d[110], sum[110][110]; int dp[110][110]; int solve(int l, int r) { if(dp[l][r] != -1) return dp[l][r]; if(l == r) return 0; int ans1, ans2; ans1 = INF; for(int i = l; i < r; i++) //枚举黑屋子里面没人的点。 ans1 = min(ans1, solve(l, i) + solve(i+1, r) + (i-l+1)*sum[i+1][r]); ans2 = solve(l+1, r) + (r-l)*d[l]; //黑屋子里面始终有人。 return dp[l][r] = min(ans1, ans2); } int main() { int t, n; scanf("%d", &t); for(int p = 1; p <= t; p++) { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", d+i); for(int i = 1; i <= n; i++) for(int j = i; j <= n; j++) { sum[i][j] = 0; for(int k = i; k <= j; k++) sum[i][j] += d[k]; } memset(dp, -1, sizeof(dp)); printf("Case #%d: %d\n", p, solve(1, n)); } return 0; }