zoukankan      html  css  js  c++  java
  • F

    简单dp。

    题目大意:有n种珍珠,这n种珍珠有不同的需求量,不同的价格,价格越高,质量越高,在购买每一种珍珠时,都需要在原来的基础上多买10个。也就是说如果需要买x种珍珠,那就要付x+10个的钱。每一种珍珠必须购买大于等于自身价格的珍珠

    输入一个t(100以内)表示t组测试,一个n,n种珍珠,a[i]和p[i]分别表示第i种珍珠的需求量个价格。价格严格递增,问最少的花费。

    题解:定义dp[i]为购买第i种珍珠所需要的总的花费。第i种珍珠可以单独购买,也可以和前边的一块购买。这里的前边的一定是i-1,i-1和i-2,或i-1,i-2,i-3。注意一定是连续的,因为价格严格递增一定不会出现只买i和i-2而不买i-1的这种情况,因为i的价格一定是高于i-1的,i-2和i-1一块购买需要的花费一定小于和i一块买的花费。

    所以状态转移方程:

      1 直接买,dp[i]=dp[i-1]+(arr[i]+10)*p[i];

      2 和前边的一块:

        for(j,0,i) dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i])

    code:

      

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll N=1E5+7;
    ll dp[N];
    ll arr[N],p[N];
    ll sum[N];
    void solve()
    {
        memset(sum,0,sizeof sum);
        memset(dp,0,sizeof dp);
        ll n;
        cin>>n;
        for(ll i=1;i<=n;i++){
            cin>>arr[i]>>p[i];
            sum[i]=sum[i-1]+arr[i];
        }
        for(ll i=1;i<=n;i++){
            dp[i]=dp[i-1]+(arr[i]+10)*p[i];
            for(ll j=0;j<i;j++)
                dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i]);
        }
        cout<<dp[n]<<endl;
    }
    int main(){
        ios::sync_with_stdio(0);
        ll t;cin>>t;
        while(t--) solve();
    
        return 0;
    }
  • 相关阅读:
    Nginx负载均衡配置实例详解
    网络性能排查
    tensorflow、cuda、cudnn之间的版本对应关系
    PyPI可以使用的几个国内源
    Ceres配置(vs2013+Win10)
    vs2013+opencv3.2配置
    Ceres Solver 在win8+vs2013环境下的安装
    51Nod-1006 最长公共子序列Lcs
    Qt中OpenGL模块下将图片转化为纹理,并传入shader中
    harris角点检测
  • 原文地址:https://www.cnblogs.com/Accepting/p/12532675.html
Copyright © 2011-2022 走看看