DP找最优配置,(POJ1018)

题目链接:http://poj.org/problem?id=1018

这个DP,我的头都快晕了。

dp[i][j]表示取到第i个设备,宽带为j时的最小价格。

状态转移方程:

dp[i][k]=min(dp[i][k],dp[i-1][k]+p)

输出结果:

for(int i=0;i<=1100;i++){

  ans=max(ans,(double)i/dp[n][i]);  

}

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int dp[120][1200];      ///dp[i][j]表示搜索到第i个设备,宽带为j时,的最少费用

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);

        for(int i=1; i<=n; i++)  ///初始化
        {
            for(int j=0; j<1100; j++)
                dp[i][j]=inf;
        }

        ///DP
        for(int i=1; i<=n; i++)
        {
            int num;
            scanf("%d",&num);
            for(int j=1; j<=num; j++)
            {
                int p,b;
                scanf("%d%d",&b,&p);
                if(i==1)
                {
                    dp[1][b]=min(dp[1][b],p);
                }
                else
                {
                    for(int k=0; k<1100; k++)
                    {
                        if(dp[i-1][k]!=inf)
                        {
                            if(k<=b)
                                dp[i][k]=min(dp[i][k],dp[i-1][k]+p);
                            else
                                dp[i][b]=min(dp[i][b],dp[i-1][k]+p);
                        }
                    }
                }
            }
        }

        double ans=0;
        for(int i=0; i<1100; i++)
        {
            if(dp[n][i]!=inf)
            {
                double k=(double)i/dp[n][i];
                if(k>ans)
                    ans=k;
            }
        }
        printf("%.3lf\n",ans);
    }
    return 0;
}
时间: 2025-01-04 14:43:02

DP找最优配置,(POJ1018)的相关文章

[FJOI2007]轮状病毒 题解(dp(找规律)+高精度)

[FJOI2007]轮状病毒 题解(dp(找规律)+高精度) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1335733 没什么好说的,直接把规律找出来,有两种规律(据说还有多种dp),再套个高精度 \(First\) \(f[1]=1,f[2]=5,f[i]=3×f[i-1]-f[i-2]+2\) 就直接写个高精+低精和高精×低精和高精-高精就行了 \(Second\) \(f[1]=1,f[2]=3,f[i]=f[i-1]+f[i-2]\) \(i

hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!

http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE,  更重要的是找出规律后,O(n)递推也过不了,TLE,一定要矩阵快速幂.然后立马GG. 用2代表m,1代表f.设dp[i][j][k]表示,在第i位,上一位站了的人是j,这一位站的人是k,的合法情况. 递推过去就是,如果j是1,k是2,那么这一位就只能放一个2,这个时猴dp[i][k][2] += dp[i - 1][j][k]; 其他情况分类下就好,然后

loj6172 Samjia和大树(树形DP+找规律)

题目: https://loj.ac/problem/6172 分析: 首先容易得出这样的dp式子 然后发现后面那个Σ其实是两段区间,可以用总和减去中间一段区间表示,所以只要维护个前缀和就ok了 这样复杂度就是O(nm)的 但是题目中的m异常巨大,有1e9,好像不能用dp做 但我们可以找下规律,发现对于一个点,其所有dp值是前后对称的,而且中间有很长的一段都是相同的数字! 设某个点x深度为d,那么它受到最“偏”的影响是来自叶子节点的,状态值之间会差d*k 对于一颗树而言,深度最大值为n-1,所以

ZOJ-3929 Deque and Balls (DP+找规律)

题目大意:n个数,每个数的大小都在1~n之间.操作n次,第 i 次将第 i 个数放到一个双端队列里面,放到队列两端的概率是相等的.问操作n次之后双端队列中元素满足xi>xi+1的对数的期望,输出的数据为:(期望*2^n)%mod. 题目分析:定义状态dp(i)表示操作 i 次之后的相应期望值.则状态转移方程为: dp(i)=1/2*(dp(i-1)+k1)+1/2*(dp(i-1)+k2)  (两种情况,放在队首和队尾) 其中,k1表示比a(i)小的元素可能与a(i)相邻的总次数,k2表示比a(

Codeforces 474D Flowers (线性dp 找规律)

D. Flowers time limit per test:1.5 seconds memory limit per test:256 megabytes We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, as we all know, Marmot eats flowers. At every dinner he eats some red and white flo

HDU 1081 DP找最大和的矩阵

题目大意: 在一个给定的大矩阵中找一个小型的矩阵,使这个矩阵中的元素和最大 可以先来看下面这个问题: 原来有做过在一个给定的数字序列中找一个最大和子序列,核心代码如下: 1 int _max = num[0]; 2 int sum = num[0]; 3 int st = 0; 4 int la = 0; 5 int rec; 6 for(int i = 1 ; i<k ; i++){ 7 if(sum < 0){ 8 rec = i;//记录起点 9 sum = 0; 10 } 11 sum

[二维费用背包DP]找啊找啊找GF

题目链接 思考 首先题目一定是背包DP(多读数据范围和题意) 其次一定是 二维费用的背包问题 (人品和金钱) 最后题目要求的是 在泡尽量多的妹子的情况下,花费最少的时间. DP转移方程一定是二维的没错,但是要满足花费最少妹子最多的这个要求就比较难以解决了.不过也不要想这么多,先看看我的分析. 假设在求解过程中如果花X元RMP,Y单位RP可以到Z个MM,那么在泡第i个MM时,发现可以用X-rmb[i]元,Y-rp[i]单位RP泡到的MM数加上这个MM(也就是+1)比原来Z多,就替换它(因为你的原则

hdu 5000 Clone (dp + 找规律)

Clone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 820    Accepted Submission(s): 403 Problem Description After eating food from Chernobyl, DRD got a super power: he could clone himself righ

HDU2451 Simple Addition expression(数位dp/找规律)

题意 对于一个非负整数 i, 当 \(i + (i+1) + (i+2)\) 计算过程中不产生进位时,称i满足条件, 求 小于n的 i 的个数. 传送门 思路 数位dp. Code #include <bits/stdc++.h> using namespace std; typedef long long ll; ll dp[20][5], n; int a[20], top; ll dfs(int pos, int sta, bool limit) { if(pos==-1) return