codeforces 713C

来源:互联网 发布:手机驱鼠软件 编辑:程序博客网 时间:2024/06/05 03:27

题意:就是把一个数列变成严格递增的数列 求最小花费


思路:直接考虑结果的整个数列   必然存在那么几个数  他是从始至终 都没有变过  那么假设有一些数会受到这个数影响 比如一个数ai不变 如果aj 是受ai影响 那么就会消耗  

abs(ai-i-aj+j) 那么我把每一个ai-i设为一个基准线 那么dp[ai-i]就是当前基准线花费最小的情况  既可获得答案 


#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>#include <vector>using namespace std;#define N 3005#define LL long longint a[N];int b[N];int c[N];int cnt,tot;LL dp[N][N];LL s[N];int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        c[cnt++]=a[i]-i;    }    sort(c,c+cnt);    for(int i=1;i<=n;i++)    {        for(int j=0;j<cnt;j++)        {            dp[i][j]=s[j]+abs(a[i]-i-c[j]);        }        s[0]=dp[i][0];        for(int j=1;j<cnt;j++)        {            s[j]=min(dp[i][j],s[j-1]);        }    }    printf("%lld\n",s[cnt-1]);    return 0;}


0 0
原创粉丝点击