您的位置:首页 > 其它

POJ 1260 Pearls (简单DP)

2015-10-08 12:10 429 查看

题目大意

给出n类珠子,以及每类珠子的数量num[i]和单价val[i]。单价从小到大排序,买每一类珠子的价格是(num[i]+10)*val[i]。问买sum(num[i])的珠子,所需最少花费。

其中,价格较低的珠子可有价格高的珠子替代,反之不行。

分析

很容易看出,珠子是不能跳跃替代的。比如说,若用第3类珠子替代第1类珠子时,则第2类珠子也要由第3类珠子替代。否则,用第2类珠子替代第1类珠子更优。

dp[i]表示买前i类珠子sum(num[i])颗所需最少花费

状态转移方程

dp[i] = min(dp[i] , (tmp + num[i]) * val[i]);


tmp = num[i] + num[i-1] + … num[k] , k >0。

初始化 dp[i] = dp[i-1] + (num[i]+10) * val[i]

时间复杂度O(n^2)

代码

#include <iostream>

using namespace std;
const int maxn = 1010;
int num[maxn] , val[maxn];
int dp[maxn] = {0}; //dp[i]表示前i类珠子的最少花费

int main()
{
int t , n;
cin >> t;
while(t--)
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> num[i] >> val[i];

dp[1] = (num[1] + 10) * val[1];
for(int i = 2; i <= n; i++) {
dp[i] = dp[i-1] + (num[i]+ 10) * val[i];
int tmp = num[i];
for(int j = i - 1; j > 0; j--) {
tmp += num[j];
dp[i] = min(dp[i] , (tmp + 10) * val[i] + dp[j-1]);
}
}
cout << dp
<< endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: