从一个序列中每次取出一个回文串,求最少取几次(取出后两端外的数会相接)
设 \(f[i][j]\) 为在闭区间 \([i,j]\) 取完所有的花费,则有 \(f[i][i]=1, f[i][i+1]=1+[a[i] \neq a[i+1]]\)
转移方程
\(f[i][j] = f[i+1][j-1], a[i]=a[j]\)
\(f[i][j] = min_{k=i}^{j-1} (f[i][k]+f[k+1][j])\)
#include
using namespace std;
int f[505][505],a[505],n;
int main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
memset(f,0x3f,sizeof f);
for(int i=1;i<=n;i++) f[i][i]=1;
for(int i=1;i