HDU 3506 Monkey Party 区间dp+四边形不等式

来源:互联网 发布:阿里云上传视频教程 编辑:程序博客网 时间:2024/05/24 06:26

//区间dp+四边形不等式优化,先把环变成长链,然后dp[i][j]代表从第i个猴子到第j个猴子全部互相认识需要的最小时间,dp[i][j]=min(dp[i][k]+dp[k+1][j])+sum[i][j];

可以证明是满足四边形不等式的。用四边形优化写一下就好了,然后预处理sum数组就是RMQ问题了,这里我觉得可以过就直接暴力了。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[2010];int s[2010][2010];int dp[2010][2010];int K[2010][2010];int main(){int n;while(scanf("%d",&n)!=EOF){a[0]=0;for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<n;i++)a[i+n]=a[i];for(int i=2;i<2*n;i++)a[i]=a[i-1]+a[i];for(int i=1;i<2*n;i++)for(int j=i;j<2*n;j++)s[i][j]=a[j]-a[i-1];for(int i=1;i<2*n;i++)K[i][i]=i,dp[i][i]=0;for(int len=2;len<=n;len++){for(int i=1;i+len<=2*n;i++){int j=i+len-1;dp[i][j]=999999999*2;   for(int k=K[i][j-1];k<=K[i+1][j]&&k<j;k++)   {         int t=dp[i][k]+dp[k+1][j]+s[i][j];         if(t<dp[i][j])         {         dp[i][j]=t;K[i][j]=k;         }       }    }    }    int ans=999999999*2;    for(int i=1;i<=n;i++)ans=min(ans,dp[i][i+n-1]);    printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击