https://www.luogu.com.cn/problem/P5504
这道题,题解说颜色内部的转移具有决策单调性,但是我打表后发现并没有单调性,我是不是哪里理解的有问题/kel
打表的 code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,mod=1e9+7;
void chkmax(int &x,int y){x=max(x,y);}
void chkmin(int &x,int y){x=min(x,y);}
void Add(int &x,int y){x+=y,x%=mod;}
int ab(int x){if(x<0)x=-x;return x;}
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+(ch-'0'),ch=getchar();
return x*f;
}
int t[N],f[N],n,a[N],mx,las[N];
vector<int>e[N],p[N];
int pai(int x){
return x*x;
}
signed main(void){
n=read();
for(int i=1;i<=n;i++)a[i]=read(),chkmax(mx,a[i]);
for(int i=1;i<=n;i++){
e[a[i]].push_back(i);int qwq=0;
for(int j=0;j<e[a[i]].size();j++){
if(f[e[a[i]][j]-1]+pai(e[a[i]].size()-j)*a[i]>=f[i])f[i]=f[e[a[i]][j]-1]+pai(e[a[i]].size()-j)*a[i],qwq=j;
}
p[a[i]].push_back(qwq);
}
for(int i=1;i<=mx;i++){
printf("%lld->",i);
for(int j=1;j<e[i].size();j++){
if(p[i][j-1]>p[i][j])printf("*");
printf("%lld ",p[i][j]);
}
printf("\n");
}
printf("%lld\n",f[n]);
return 0;
}
测试的数据: