Making the Grade
×这是一种
状态定义
的最小花费
不需要考虑其中
(以上垃圾缩写《算法竞赛进阶指南》)
但……
#include<bits/stdc++.h>
using namespace std;
long long a[2001];
long long f[2001];
long long ans=LLONG_MAX;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
f[i]=LLONG_MAX;
}
f[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i-1;j++)
{
if(a[i]<a[j])
continue;
long long cost=0;
long long res=LLONG_MAX;
for(int k=j+1;k<=i-1;k++)cost+=abs(a[k]-a[i]);
res=min(res,cost);
for(int k=j+1;k<=i-1;k++){
cost=cost-abs(a[k]-a[i])+abs(a[j]-a[k]);
res=min(res,cost);
}
f[i]=min(f[i],f[j]+res);
}
}
for(int i=1;i<=n;i++)
{
long long res=f[i];
for(int j=i+1;j<=n;j++)
{
res+=abs(a[i]-a[j]);
}
ans=min(ans,res);
}
printf("%lld\n",ans);
return 0;
}
其实我写这个的原因是在网上找不到这种写法的代码
此非正解(仅供娱乐)90‘