WTF交换

来源:互联网 发布:苹果手机载入数据失败 编辑:程序博客网 时间:2024/04/30 15:11

模拟

题意真麻烦不说了。
用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);}
0 0
原创粉丝点击