概率DP Research Productivity Index 一维DP的优化 邮票收集问题的拓展

题目链接:https://ac.nowcoder.com/acm/contest/13168/G
这篇博客重点在一维优化代码的初始化操作.
题目要求:给n份论文,每份有k的可能性通过,有一种独特的方法来评估论文提交的成功。他们使用‎‎的研究生产力指数‎‎,定义为a^(a/s)‎其中‎s‎是提交的文件总数,a‎是会议接受的文件数量.
例如‎:如果提交一个文件并被接受,索引是‎1^(1/1)=1;
‎如果提交了‎‎10‎‎篇论文,并接受了‎‎3‎‎篇论文,索引3^(3/10)≈1.390389.
有N个论文 如果明智地选择提交哪些论文,她的研究生产力指数的最大预期值是什么.

一个比较常规的概率DP,比赛时题目没搞清楚,思路有点偏,就放弃了,去做别的题目.

二维
dp[i][j]=dp[i-1][j](1-a[i]/100.0)+dp[i-1][j-1]a[i]/100.0;
dp[i][j]表示第i件物品中过了j件物品的概率.如果第i件过了,那么就是dp[i-1][j-1]
a[i]的概率,如果第i件没过就是dp[i-1][j]
(1-a[i])的概率.

二维DP
double dp[105][105];
int a[105];
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+1+n,cmp);
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        dp[i][0]=dp[i-1][0]*(1-a[i]/100.0);
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
            dp[i][j]=dp[i-1][j]*(1-a[i]/100.0)+dp[i-1][j-1]*a[i]/100.0;
    double ans=0;
    double tem=0;
    for(int i=1;i<=n;i++)
    {
        tem=0;
        for(int j=1;j<=i;j++)
        {
            tem+=dp[i][j] * pow(j, j * 1.0 / i);

        }
        ans=max(ans,tem);
    }
    printf("%.9lf\n",ans);
}

一维DP
一维思路
由于dp[i][j]=dp[i-1][j](1-a[i]/100.0)+dp[i-1][j-1]a[i]/100.0;
dp[i][j]是由dp[i][j-1]推导而来所以是逆序.

double dp[105];
double a[105];
bool cmp(double x,double y)
{
    return x>y;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i]=a[i]/100.0;
    }
    sort(a+1,a+1+n,cmp);
    dp[0]=1;
    double ans=0;
    for(int i=1;i<=n;i++)//提交数量
    {
        double tem=0;

        for(int j=i;j>=1;j--)//通过数量.
        {
            dp[j]= dp[j-1]*a[i] + dp[j]*(1-a[i]);
            tem+=dp[j]*pow(j,j*1.0/i);
        }
        dp[0]=dp[0]*(1-a[i]);
        ans=max(ans,tem);
    }
    printf("%.9lf\n",ans);
}
全部评论

相关推荐

点赞 评论 收藏
分享
12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务