題目鏈接:[TJOI2007]調整隊形
顯然可以區間dp。
但是如果枚舉插入的位置,那麼複雜度是N^3的,會TLE。
但是我們可以發現插入的操作其實就是之前某個更小狀態的左右加一個人的操作,所以不用管。
然後加一個人和刪除又是等價的。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=3010,inf=0x3f3f3f3f;
int n,dp[N][N],a[N];
int dfs(int l,int r){
if(l>=r) return 0;
if(dp[l][r]!=inf) return dp[l][r];
if(a[l]==a[r]) dp[l][r]=dfs(l+1,r-1);
else dp[l][r]=min(min(dfs(l+1,r),dfs(l,r-1)),dfs(l+1,r-1))+1;
return dp[l][r];
}
signed main(){
cin>>n; memset(dp,0x3f,sizeof dp);
for(int i=1;i<=n;i++) cin>>a[i];
cout<<dfs(1,n);
return 0;
}