给你一个长度为 n(1≤n≤500)n(1n500) 的数组 aa,每次你可以进行以下两步操作:

  1. 找到 i∈[1,n)i[1,n),使得 ai=ai+1ai=ai+1

  2. 它们 替换为 ai+1ai+1。

每轮操作之后,显然数组的长度会减小 11,问剩余数组长度的最小值。

 

 

#include <iostream>
#include<queue> 
#include <cstring>
#define IOS std::ios::sync_with_stdio(0)
using namespace std;
 const int N =550;
 int a[N],f[N][N],n,num[N][N];
 
 
 void solve(){
 	int i,j,k;
 	cin>>n; 
 	memset(f,100,sizeof f);
 	for(i=1;i<=n;i++) 
 		cin>>a[i],f[i][i]=1,num[i][i]=a[i];
 	
 	for(int len=2;len<=n;len++)
 	for(i=1;i+len-1<=n;i++){
 		j=i+len-1;
 		for(k=i;k<j;k++){
 			f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
 			if(f[i][k]==1&&f[i][k]==f[k+1][j]&&
 				num[i][k]==num[k+1][j]){
 					f[i][j]=1,num[i][j]=num[i][k]+1;	
 				}
 		}
 	}
 	cout<<f[1][n]<<endl;
 }
 signed main(){
     IOS;
     solve();
 }
 
 

 

posted on 2023-02-23 23:27  towboat  阅读(21)  评论(0)    收藏  举报