[TJOI2007]調整隊形

題目鏈接:[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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章