写了一个特别错的转移方程(这里暂时忽略复杂度),过了所有能跑的动的点。想问下这个到底是数据水了还是有什么性质没有发现?
代码:
#include<bits/stdc++.h>
#define int long long
#define N 2005
#define pii pair<int,int>
#define x first
#define y second
#define pct __builtin_popcount
#define mod 7
#define pi acos(-1)
#define inf 2e18
#define eps 1e-8
using namespace std;
int T=1,n,a[N],b[N],f[N][N];
void solve(int cs){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
memset(f,0x3f,sizeof f);
for(int i=1;i<=n;i++){
f[0][i]=0;
}
int res=inf;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=j;k++){
f[i][j]=min(f[i][j],f[i-1][k]+abs(b[k]-a[i]));
}
}
}
for(int i=1;i<=n;i++){
res=min(res,f[n][i]);
}
reverse(a+1,a+n+1);
memset(f,0x3f,sizeof f);
for(int i=1;i<=n;i++){
f[0][i]=0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=j;k++){
f[i][j]=min(f[i][j],f[i-1][k]+abs(b[k]-a[i]));
}
}
}
for(int i=1;i<=n;i++){
res=min(res,f[n][i]);
}
cout<<res<<'\n';
}
void solution(){
/*
nothing here
*/
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// init();
// cin>>T;
for(int cs=1;cs<=T;cs++){
solve(cs);
}
return 0;
}