【17 提高 9】合并集合

题目传送门

就是石子合并,贡献不一样罢了

贡献为sum_{i,k}\times sum_{k+1,j}

直接set n^2sum_{i,j}就行了

rep(i,1,n*2){
	set<int> s;
	rep(j,i,n*2)s.insert(a[j]),sum[i][j]=s.size();
}

Code

#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<deque>
#include<string>
#include<bitset>
#include<vector>
#include<cstdio>
#include<complex>
#include<cstdlib>
#include<climits>
#include<iomanip>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>

#define int long long

#define pb(x) push_back(x)
#define lowbit(x) x&(-x)
#define mkp make_pair


#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)

#define fan putchar('\n')
#define fak putchar(' ')

//c++11 [-std=c++11]

//#pragma GCC optimize(2,3,"Ofast","inline")

using namespace std;

inline int read() {
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void write(int X) {
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}

#define mod 998244353
#define N 400*2

int n,a[N];
int f[N][N];
int sum[N][N];
int mx;

void solve(){
	//别挂了
	n=read();
	rep(i,1,n)a[i]=a[i+n]=read();
	rep(i,1,n*2){
		set<int> s;
		rep(j,i,n*2){
			s.insert(a[j]);
			sum[i][j]=s.size();
		}
	}
	rep(l,1,n-1)for(int i=1,j=i+l;(j<n+n)&&(i<n+n);i++,j=i+l)rep(k,i,j-1)f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+sum[i][k]*sum[k+1][j]);
	rep(i,1,n)mx=max(mx,f[i][i+n-1]);
	write(mx);
}

signed main(){
	solve();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值