(玄关)区间dp,不知为何21分。
查看原帖
(玄关)区间dp,不知为何21分。
1029122
Fish_redflying楼主2024/8/20 21:11

rt.

个人认为算法没问题。

find_代表对于某种状态可能的代表的数。

#include<bits/stdc++.h>
#define max_size 305
using namespace std;
int ans[max_size][max_size];
int find_[max_size][max_size][max_size];
int f[max_size][max_size];
int arr[max_size];
int n,tot;
/*
cout<<i<<" "<<k<<" "<<j<<endl;
if (f[i][k]==f[k][j]) {
f[i][j]=max(f[i][j],f[i][k]+1);
} 
*/
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
	for(int i=1;i<=n;i++) ans[i][i]=arr[i];
	for(int i=1;i<=n;i++) {
		for(int j=i+1;j<=n;j++) {
			if (ans[i][j-1]==arr[j]) 
				ans[i][j]=max(ans[i][j],ans[i][j-1]+1);
			else 
				ans[i][j]=arr[i];
			tot=max(ans[i][j],tot);
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=i+1;j<=n;j++) {
			find_[i][j][ans[i][j]]=1;
			f[i][j]=ans[i][j];
		}
	}
	for(int len=2;len<n;len++) {
		for(int i=1;i<len;i++) {
			for(int j=0;j<=n-len;j++) {
				if (find_[j+i][len][f[j][j+i]] || find_[j][j+i][f[j+i][len]]) {
					f[j][j+len]=max(f[j][j+len],f[j][j+i]+1);
					find_[j][j+len][f[j][j+len]]=1;
				} 				
			}
		}
	} 
	cout<<f[1][n];		
	
}
2024/8/20 21:11
加载中...