2018.8.6T1(dp)

描述
(为什么老师要放炉石的图这里写图片描述
题目大意: 你有一个可重集合A,A中的元素是正整数,当一个元素变为0时从集合中删除。 你可以花费p使一个元素+1,花费q使一个元素−1。 你有一次机会花费r使得集合中所有元素−1,若有元素因此被删除,则重复这个操作(不需要额外的花费)。 你的目标是最小化将集合变为空集的花费。
输入格式
第一行一个整数n表示场面上有n个随从。

接下来一行n个数,第ii个数a[i]为第i个随从的生命值。

接下来一行三个数p,q,r分别表示每张香蕉,月火术和亵渎在当前游戏中的费用。

输出格式
一行一个整数ans,表示为了清空场面至少需要的费用。

样例1
样例输入
5
1 1 5 6 7
5 4 2
样例输出
31


这题的贪心是有bug的,因为他不一定是一个严格递增的时候再使用亵渎,你目前的决策会影响后面的决策。
但是一个结论是没错的,我们肯定会在最后使用亵渎
其次,一个数在原数中的排名肯定是和最后使用亵渎时一样的
这是可以反证证出来的
fi,j f i , j 表示前 i i 个数,最后一个数高度是j的方案数
fi1,j,fi1,j1 f i − 1 , j , f i − 1 , j − 1 转移一下就行了

我写的是 fi,j f i , j 能减少的花费,所以我取得是 max m a x
别忘了最后和不用亵渎的情况取个 min m i n ,可能不用亵渎会更优

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define ll long long
int n , a[5010];
int p , q , r;
ll Max; 
ll f[5010][5010] , sum;
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while( c < '0' || c > '9' ) {if(c == '-') flag = false;c = getchar();}
    while( c >= '0' && c <= '9' ) sum = sum * 10 + c - 48 , c = getchar();
    if(flag)  return sum;
     else return -sum;
}  
void init()
{
    n = read();
    rep(i,1,n) a[i] = read() , sum = sum + a[i];
    p = read();q = read();r = read();
    sort(a + 1,a + n + 1);
    return;
}
void work()
{
    memset(f,-10,sizeof(f));
    f[0][0] = 0;
    sum = sum * q;
    rep(i,1,n)
       rep(j,1,i)//i个人高度为j
       {
            int fff = 0;
            if(a[i] < j) fff = 1;
            f[i][j] = max(f[i-1][j-1],f[i-1][j]);
            f[i][j] = f[i][j] - 1ll * fff * p * (j-a[i]);
            f[i][j] += 1ll * q * min(j,a[i]);
       }
    Max = 0;
    rep(i,1,n)
        rep(j,1,n)
            Max = max(Max,f[i][j]);
    Max -= r;
    printf("%lld\n",min(sum,sum-Max));
    return;
}
int main()
{
    init();
    work();
    return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
select * from (select t1.[id] as t1_id,t1.[requestId] as t1_requestId,t1.[htqsrq] as t1_htqsrq,t1.[htjzrq] as t1_htjzrq,t1.[htbh] as t1_htbh,t1.[gf] as t1_gf,t1.[xf] as t1_xf,t1.[rq] as t1_rq,t1.[fkfs] as t1_fkfs,t1.[formmodeid] as t1_formmodeid,t1.[modedatacreater] as t1_modedatacreater,t1.[modedatacreatertype] as t1_modedatacreatertype,t1.[modedatacreatedate] as t1_modedatacreatedate,t1.[modedatacreatetime] as t1_modedatacreatetime,t1.[modedatamodifier] as t1_modedatamodifier,t1.[modedatamodifydatetime] as t1_modedatamodifydatetime,t1.[form_biz_id] as t1_form_biz_id,t1.[MODEUUID] as t1_MODEUUID,t1.[htfj] as t1_htfj,t1.[zje] as t1_zje,t1.[ds] as t1_ds,t1.[zjedx] as t1_zjedx,t1.[cspp] as t1_cspp,t1.[yfk] as t1_yfk,t1.[gxid] as t1_gxid,t1.[bz] as t1_bz,t1.[gfqymc] as t1_gfqymc,t1.[gfjc] as t1_gfjc,t1.[bh] as t1_bh,t1.[jylx] as t1_jylx,t1.[cght] as t1_cght,t1.[yf] as t1_yf,t1.[yfk1] as t1_yfk1,t1.[yf11] as t1_yf11,t1.[nf] as t1_nf,t1.[rksj] as t1_rksj,t1.[cclx] as t1_cclx,t1.[cgbt] as t1_cgbt,t1.[yfk2] as t1_yfk2,t1.[sywf] as t1_sywf,t1.[yfbl] as t1_yfbl,t1.[fhbl] as t1_fhbl,t1.[yfh] as t1_yfh,t1.[sykf] as t1_sykf,t1.[hzsdlqys] as t1_hzsdlqys,t1.[sys_workflowid] as t1_sys_workflowid,t1.[cgqzyz] as t1_cgqzyz,t1.[htwjpdf] as t1_htwjpdf,t1.[cghtlc] as t1_cghtlc,t1.[htzt] as t1_htzt,t1.[qzfs] as t1_qzfs,t1.[htwjtp] as t1_htwjtp,t1.[cgqzlc] as t1_cgqzlc,t1.[sjfk] as t1_sjfk,t1.[ydkds] as t1_ydkds,t1.[chpt] as t1_chpt,t1.[lxdhchr] as t1_lxdhchr,t1.[gxsjkx] as t1_gxsjkx,t1.[hkzt] as t1_hkzt,t1.[lcfkd] as t1_lcfkd,t1.[fkzlcid] as t1_fkzlcid,t1.[mode_top_4] as t1_mode_top_4,t1.[cgdj] as t1_cgdj,t1.[mode_top_22] as t1_mode_top_22,t2.[id] as t2_id,t2.[mainid] as t2_mainid,t2.[sld] as t2_sld,t2.[ppcj] as t2_ppcj,t2.[hsdj] as t2_hsdj,t2.[bz] as t2_bz,t2.[je] as t2_je,t2.[xhggyt] as t2_xhggyt,t2.[mxgxid] as t2_mxgxid,t2.[dqkckc] as t2_dqkckc,t2.[rkhkc] as t2_rkhkc,t2.[yf] as t2_yf,t2.[yldjbhyf] as t2_yldjbhyf,SELECT year(rksj) as 年 FROM uf_gfht as cus_年年 from uf_gfht t1 INNER join uf_gfht_dt1 t2 on t1.id = t2.mainid) tmp1 where t1 错在哪里
最新发布
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值