zoukankan      html  css  js  c++  java
  • hdu_4283_You Are the One(区间DP)

    题目链接:hdu_4283_You Are the One

    题意:

    有n个人,每个人有个屌丝值,如果果他是第K个上场,不开心指数就为(K-1)*D,然后有个小黑屋,可以调整他们的出场顺序,现在让你调整顺序,使不开心指数最小

    题解:

    考虑区间DP,dp[i][j]表示第i个人到第j个人这个区间的不开心指数最小的方案,然后我们更新dp[i][j],考虑第i个人在这个区间中第k出场,

    那么dp[i][j]=min(dp[i][j],v[i]*(k-i)+(k-i+1)*(sum[j]-sum[k])+dp[i+1][k]+dp[k+1][j]),其中dp[i+1][k]表示将第i个人调到这个区间的第k出场,那么后i+1到k的最优出场顺序就是dp[i+1][k],把第i个人调到k出场后,后k+1到j的人的最优出顺序为dp[k+1][j],因为把第i个人向后调了k-i,所以不开心指数会加v[i]*(k-i),

    因为后面k+1到j的人排在了(k-i+1)个人的后面,所有这个区间的人的不开心指数全部要加上去,即:(k-i+1)*(sum[j]-sum[k])

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;i++)
     3 using namespace std;
     4 
     5 inline void up(int &a,int b){if(a>b)a=b;}
     6 
     7 int t,n,ic=1,dp[105][105],sum[105],v[105],inf=1e9+7;
     8 
     9 int main()
    10 {
    11     scanf("%d",&t);
    12     while(t--)
    13     {
    14         scanf("%d",&n);
    15         F(i,1,n)scanf("%d",v+i),sum[i]=sum[i-1]+v[i];
    16         memset(dp,0,sizeof(dp));
    17         F(i,1,n)F(j,i+1,n)dp[i][j]=inf;
    18         F(l,1,n-1)F(i,1,n-l)F(k,i,i+l)
    19         up(dp[i][i+l],v[i]*(k-i)+(k-i+1)*(sum[i+l]-sum[k])+dp[i+1][k]+dp[k+1][i+l]);
    20         printf("Case #%d: %d
    ",ic++,dp[1][n]);
    21     }
    22     return 0;
    23 }
    View Code
  • 相关阅读:
    Qt 6 正式发布
    GTK 4.0 正式发布
    编译 flink 1.12.0
    Flink 1.12.0 sql 任务指定 job name
    【翻译】Apache Flink 1.12.0 Release Announcement
    【源码】Flink 三层图结构 —— JobGraph 生成过程
    【源码】Flink 算子 chain 在一起的条件
    Web开发基础之CMDB系统开发之三
    Web开发基础之CMDB系统开发之二
    Ubuntu18.04升级至20.04
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5914714.html
Copyright © 2011-2022 走看看