給出乙個長度為n的整數陣列,每次可以去掉乙個連續的回文子串行。
剩下的會靠攏,問最少幾次可以去完。
經典區間dp。
\(dp[i][j]\)表示把區間\([i,j]\)消除完的最小值
轉移方程:
if arr[i]==arr[j]: dp[i][j]=dp[i+1][j-1]
dp[i][j]=min(dp[i][k],dp[k+1][j])
#include#include#include#include#include#include#define pb push_back
typedef long long ll;
using namespace std;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const int n = 500+10;
int n,arr[n],dp[n][n];
int main()
for(int k=j;kdp[j][en]=min(dp[j][en],dp[j][k]+dp[k+1][en]);}}
printf("%d\n",dp[1][n]);
return 0;}/*
*/