zoukankan      html  css  js  c++  java
  • 洛谷P1412 经营与开发题解

    题目链接QWQ这里就不阐述了;

    题解部分:

    从题面上来看,这是个dp(递推)的题目。

    但是dp要满足无后效性,但这个题为了取最值,得考虑从当前开始一直持续到结束的p的影响。

    这让我们怎么满足无后效性??

    当时我一懵

    but,

    如果反过来,那么他不就满足无后效性了吗QWQ。

    也就是无前效性。

    具体来说,如果p对以后的造成影响,那么我们从最后一位开始dp,往前推,那么p只会对已经推完的造成影响,不会对没推的造成影响,这样不就满足无后效性了吗?

    那么只要把题目中讲到的运算反着来写(+变成-),就ok了。

    我们用dp[i]来表示从最后一个n到i的最优解,那么dp转移方程就是:

    if(type[i]==1)

      dp[i]=max(dp[i+1],rqych[i]+dp[i+1]*(1-0.01*k));
    else

      dp[i]=max(dp[i+1],dp[i+1]*(1+0.01*c)-rqych[i]);

    对于每一种type分别进行判断。

    AC代码:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int read()//自研快读
    {
        int ans=0;
        char ch=getchar(),last=' ';
        while(ch<'0'||ch>'9')last=ch,ch=getchar();
        while(ch>='0'&&ch<='9')ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
        return last=='-'?-ans:ans;
    }
    int n,k,c,w,x,type[100001];
    double dp[100001],rqych[100001];//rqy和ych是两个神仙
    int main(){
        n=read(),k=read(),c=read(),w=read();
        for(int i=1;i<=n;i++)
        {
            type[i]=read();rqych[i]=read();
        }
        for(int i=n;i>=1;i--)//倒着找
        {
            if(type[i]==1)//主要dp方程
                dp[i]=max(dp[i+1],rqych[i]+dp[i+1]*(1-0.01*k));
            else dp[i]=max(dp[i+1],dp[i+1]*(1+0.01*c)-rqych[i]);
        }
        printf("%0.2lf",dp[1]*w);
    } 

    没了。。

    QWQ

  • 相关阅读:
    oracle基本语句
    java Scanner和异常
    流Stream 文件File 流IO
    java基本方法
    jsp页面展示更加商品的分类,控制商品的显示
    使用jquery select2实现下拉框搜索功能
    JSONObject和JSONArray
    GsonUtils.getGson().fromJson() 转泛型集合用法
    java 实现图片上传功能
    mysql :将其中两个数据的某一个字段合拼成一句
  • 原文地址:https://www.cnblogs.com/lbssxz/p/11166100.html
Copyright © 2011-2022 走看看