poj1260Pearls(dp)

Posted Collapsars

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1260Pearls(dp)相关的知识,希望对你有一定的参考价值。

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

具体思路:

首先,所需珍珠的数目是固定的,而且每种珍珠所需的数目,可以使用比此种珍珠珍贵(就是价格高的)的珍珠所替代,其次,题目所给珍珠的顺序是按价格由低到高给的,我们可以发现一个规律,珍珠不能隔着种类交换,就是说假设一共三类珍珠,第一种如果需要用第三种替代的话,那么第二种也必须被第三种替代,如果不这么做的话那么第二种需要单独支付额外费用,那么此时,显然如果把第一种用第二种替代更合适,花费更少。这只是说明了珍珠不能隔着替换。我们可以求前i种珍珠所花费的最少费用,那么第i种珍珠所花费的费用可以有多种选择,我们需要求出多种选择中所花费的最少的费用,我们可以用j来枚举前i种所有的选择,可以得到动态转移方程dp[i] = min(dp[i] , (sum[i] - sum[j]) * p[i] + dp[j]);值得注意的是,前i种珍珠的所有选择是从前i种全部都由第i种珍珠所替换枚举到前i种珍珠只有第i种珍珠是按照第i种珍珠价格购买的(也就是前i种没有一种被第i种替换)。

 #include<iostream>
 #include<cstdio>
 #include<algorithm>
 #include<vector>
 #include<map>
 #include<queue>
 #include<set>
 #include<cmath>
 #include<list>
 #include<cstring>
 #include<string>
 #define ll long long
 #define ull unsigned long long
 #define inf 0x3f3f3f3f
 #define inff 0x7fffffff
 using namespace std;
 const int N = 100 + 10;
 
 int a[N], sum[N], dp[N], p[N];
 
 int main() 
 
     int T;
     cin >> T;
     while (T--) 
         memset(dp, 0x3f, sizeof(dp));
         int n;
         cin >> n;
         for (int i = 1; i <= n; i++) 
             cin >> a[i] >> p[i];
             sum[i] = sum[i - 1] + a[i];
         
         dp[0] = 0;
         for (int i = 1; i <= n; i++) 
             for (int j = 0; j < i; j++) 
                 dp[i] = min(dp[i], (sum[i] - sum[j] + 10) * p[i] + dp[j]);
             
         
         cout << dp[n] << "\\n";
     
 
     return 0;
 

 

 
 

以上是关于poj1260Pearls(dp)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1260-Pearls(DP)

POJ-1260-Pearls-dp+理解题意

poj1260Pearls(dp)

POJ-1260 Pearls---DP

Pearls POJ - 1260 dp

POJ 1260 Pearls