LightOJ 1422 Halloween Costumes(区间DP)

来源:互联网 发布:网络搞笑歌曲你是谁 编辑:程序博客网 时间:2024/04/28 23:55

思路:分两种转移,一种直接穿上一件dp[i][j] = dp[i + 1][j] + 1;

另一种是,这一件重复使用,那么就要在区间内枚举出c[i] == c[l]的位置,然后dp[i][j] = min(dp[l + 1][i - 1] + dp[i][r]);

代码:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 105;int t, n, c[N];int dp[N][N];int dfs(int l, int r) {if (dp[l][r] != -1) return dp[l][r];if (l > r) return dp[l][r] = 0;dp[l][r] = dfs(l + 1, r) + 1;for (int i = l + 1; i <= r; i++)if (c[i] == c[l])dp[l][r] = min(dp[l][r], dfs(l + 1, i - 1) + dfs(i, r));return dp[l][r];}int main() {int cas = 0; scanf("%d", &t);while (t--) {scanf("%d", &n);memset(dp, -1, sizeof(dp));for (int i = 1; i <= n; i++)scanf("%d", &c[i]);printf("Case %d: %d\n", ++cas, dfs(1, n)); }return 0;}


0 0