模拟
题意真麻烦不说了。
用DP模拟题意yy一下加优化就好了,详见代码。
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int maxn=3000+10,inf=100000000;
int f[maxn][maxn],re[maxn][maxn];
int a[maxn],id[maxn];
int i,j,k,l,t,n,m,ans;
int mo(int x){
return (x%n+n)%n;
}
int main(){
//freopen("t4.in","r",stdin);freopen("t4.out","w",stdout);
scanf("%d%d",&n,&m);
fo(i,0,n-1) scanf("%d",&a[i]);
fo(i,2,n+1)
fo(j,1,n-1)
f[i][j]=-inf;
fo(i,2,n+1){
t=-inf;
k=0;
fo(j,1,n-1){
f[i][j]=f[i-1][j]+a[mo(j-1-l)]-a[mo(j-l)];
re[i][j]=j;
if (t-a[mo(j-l)]>f[i][j]){
f[i][j]=t-a[mo(j-l)];
re[i][j]=k;
}
if (a[mo(j-1-l)]+f[i-1][j]>t){
t=a[mo(j-1-l)]+f[i-1][j];
k=j;
}
}
t=-inf;
k=0;
fd(j,n-1,1){
if (t+a[mo(j-1-l)]>f[i][j]){
f[i][j]=t+a[mo(j-1-l)];
re[i][j]=k;
}
if (-a[mo(j-l)]+f[i-1][j]>t){
t=-a[mo(j-l)]+f[i-1][j];
k=j;
}
}
l=(l+m)%n;
}
ans=-inf;
fo(i,1,n-1)
if (f[n+1][i]>ans){
ans=f[n+1][i];
id[n+1]=i;
}
printf("%d\n",ans);
fd(i,n+1,2)
id[i-1]=re[i][id[i]];
fo(i,1,n+1) printf("%d ",id[i]);
//fclose(stdin);fclose(stdout);
}