题目描述
太烦了,不想复制。(洛谷的文本比较离谱)~~~
分析
题意:从一个序列中每次取出一个回文串,求最少取几次(取出后两端外的数会相接)。
做法:区间DP。
设 dp[i][j] 为在 [i, j] 的闭区间内最少的花费,则:
- dp[i][i] = 1
- dp[i][i + 1] = 1 (a[i] == a[i + 1])
-
dp[i][i + 1] = 2 (a[i] != a[i + 1])
so,转移方程为:
dp[i][j] = dp[i + 1][j − 1] (a[i] == a[j])
dp[i][j] = min(dp[i][k] + dp[k + 1][j], dp[i][j])
AC代码
#include <bits/stdc++.h>
#define N 510
#define INF 0x3f3f3f3f
using namespace std;
int n, a[N], dp[N][N];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
m