[kuangbin带你飞]专题十二 基础DP1 S POJ 3666

来源:互联网 发布:人工智能电影我看哭了 编辑:程序博客网 时间:2024/06/03 21:02

题目地址:https://vjudge.net/contest/68966#problem/S

思路:经典DP。转移方程如下,然后dp直接存当前位置的最小值,省去了找k的过程。话说貌似abs不能对long long使用?

dp[i][j]  = min(dp[i – 1][k]) + |A[i] – B[j]|       (k = 0…j)

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=2000+10;long long a[maxn];long long b[maxn];int n;long long dp[maxn][maxn];bool cmp1(long long a,long long b){    return a<b;}bool cmp2(long long a,long long b){    return a>b;}int main(){    while(~scanf("%d",&n))    {        for(int i=1;i<=n;i++)        {             scanf("%I64d",&a[i]);             b[i]=a[i];        }        sort(b+1,b+1+n,cmp1);        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)        {           long long temp1=a[i]-b[1];            if(temp1<0)                temp1=-temp1;           dp[i][1]=dp[i-1][1]+temp1;           for(int j=2;j<=n;j++)           {               long long temp=(a[i]-b[j]);               if(temp<0)                temp=-temp;             dp[i][j]=min(dp[i][j-1],dp[i-1][j]+temp);           }        }        long long ans=0x3f3f3f3f;        ans=dp[n][n];        sort(b+1,b+1+n,cmp2);        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)        {            long long temp1=a[i]-b[1];            if(temp1<0)                temp1=-temp1;           dp[i][1]=dp[i-1][1]+temp1;             for(int j=2;j<=n;j++)           {               long long temp=(a[i]-b[j]);               if(temp<0)                temp=-temp;             dp[i][j]=min(dp[i][j-1],dp[i-1][j]+temp);           }        }        ans=min(ans,dp[n][n]);        printf("%I64d\n",ans);    }}


0 0
原创粉丝点击