区间DP。
这题好难想....做区间DP专题的时候,第一题看的就是这题,发现不会然后一直没去做,直到今天专题中其余的题都切完了再看这题...依旧无头绪,还是看了题解....看了也发现好难。。。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF = 0x7FFFFFFF; const int maxn = 100 + 10; int T, n; int a[maxn]; int dp[maxn][maxn]; void read() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); } void init() { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) dp[i][j] = j - i + 1; } void work() { for (int i = 2; i <= n; i++) { for (int j = 1; j <= n; j++) { int st = j, en = st + i - 1; if (en>n) continue; dp[st][en] = min(dp[st][en], dp[st + 1][en] + 1); if (a[st] == a[en]) dp[st][en] = min(dp[st][en], dp[st][en - 1]); for (int k = st + 1; k <= en - 1; k++) if (a[st] == a[k]) dp[st][en] = min(dp[st][en], dp[st][k] + dp[k + 1][en]); } } printf("%d ", dp[1][n]); } int main() { scanf("%d", &T); for (int c = 1; c <= T; c++) { read(); init(); printf("Case %d: ", c); work(); } return 0; }