题目大意:

买珍珠,每买一种珍珠需要额外付出十个这种珍珠的钱,但你可以买比这种珍珠高品质的珍珠来替换它(那么就只需要那高品质付出那额外的十个珍珠的钱了,但是每个珍珠的价钱也变化了)

这是一个dp。

令dp[i]为只买前i种珍珠的最少花费钱数,

状态转移方程为dp[i] = min(dp[i],dp[j]+sum);

这里j<i, sum为j之后到i种珍珠均用第i种珍珠替换所需要的钱数;

sum是很好解决的。

那么有人问了,这个状态转移只能求第i种只替换前面连续种珍珠的情况,如果是像1和3都用第三种珍珠替换,而第二种自己买你的不就不能求了。也就是说如果某种珍珠需要替换前面不连续的几种的话怎么办呢?

现在我们来证明那种情况是不存在的。

我们设每种的价格为xi,每种需要买的个数为ni,每买一种需要额外付出的钱数为ci。

情况一为1,3种珍珠一起买,2珍珠单独买;

那么需要(n1+n3+10)*x3+(n2+10)*x2;

情况2为1,2种珍珠一起买,3珍珠单独买;

则需要(n3+10)*x3+(n1+n2+10)*x2;

如果情况一比情况2学要的钱数少,列不等式可得x3<=x2。

那么2种珍珠也应该用3来替换这样显然更省钱(少付了额外十个2种珍珠的钱);

所以1用3替换那么2就肯定也用3来替换;

推广起来;

如果某一种珍珠替换了前面不连续种珍珠为最优解;

那么就说明替换的最前面珍珠的后面那些没替换的珍珠的单价大于用来替换的珍珠的单价;

那么那些没替换的替换点显然为更优解,所以被替换的珍珠必然不能是不连续的,而且要紧挨着用来替换的珍珠;

证明完毕;

上代码;

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int maxa = ;
int sum[maxa];
int dp[maxa];
int a[maxa], b[maxa];
int main(){
int t, n;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d%d", &a[i], &b[i]);
sum[i] = sum[i-] + a[i];
}
for(int i = ; i <= n; i++){
int mina = (<<);
for(int k = ; k < i; k++){
mina = min(mina, dp[k] +(sum[i] - sum[k]+)*b[i]);
}
dp[i] = mina;
}
printf("%d\n", dp[n]);
}
}

acm poj1260 dp的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【转载】ACM总结——dp专辑

    感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一 ...

  3. Codeforces Round #240 (Div. 1)B---Mashmokh and ACM(水dp)

    Mashmokh's boss, Bimokh, didn't like Mashmokh. So he fired him. Mashmokh decided to go to university ...

  4. bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2635  Solved: 1090 [id=1030&qu ...

  5. WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp

    title: WOJ1022 Competition of Programming 贪心 date: 2020-03-19 13:43:00 categories: acm tags: [acm,wo ...

  6. 【题解】SDOI2014数数

    真的很开心呢,总算是有一道完完全全由自己做出来的题目啦~ 这一道题目洛谷P3311和另一道JSOI文本生成器的题目是十分相像的,dp方面几乎相同.只是<=n的约束,让这道题目必须结合数位dp的方 ...

  7. DP(Dynamic programming)——尽力学习之中(2016 HUAS ACM 暑假集训-5)

    这周不打算按照以往的方式更新博客,而是采用整体的方式.一是因为学的太少,没东西写:二是这篇博客会经常更新的.如题,DP——尽力学习之中. ------------------------------- ...

  8. HDU 4064 Carcassonne(插头DP)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4064 Problem Description Carcassonne is a tile-based ...

  9. 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

随机推荐

  1. 如何修改WAMP中mysql默认空密码&重新登录phpmyadmin

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按回车 ...

  2. shell脚本实现覆盖写文件和追加写文件

    1.覆盖写文件 ">" date  > not_append_file.txt

  3. Go Cookie 练习

    package main import ( "io" "log" "net/http" ) func main() { http.Handl ...

  4. android 通过代码设置drawableLeft

    /** * * @desc 设置左边图标 * @param @param drw * @return void */ public void setAlertLeftIcon(Drawable drw ...

  5. altium designer不经过原理图直接在空白pcb上加封装然后画线

    如果是复杂点的PCB,建议还是画下SCH,如果PCB只有几个元件,那么可以用这种方法,想不画原理图,直接进行布线,往往是很多初学者最想知道的,但是这也一定不是初学者能学到的.因为你买的书,都是按画PC ...

  6. MFC中DoDataExchange()的作用

    void CDlgSelectCS::DoDataExchange(CDataExchange* pDX) {     CDialog::DoDataExchange(pDX);     DDX_Te ...

  7. 二叉查找树:Python实现

    #coding:utf8 #author:HaxtraZ class BST(object): """二叉查找树的简单实现""" def _ ...

  8. 8.2.1.13 Multi-Range Read Optimization 多个range 读优化

    8.2.1.13 Multi-Range Read Optimization 多个range 读优化 读记录使用一个range scan 在一个secondary index 可以导致很多的随机磁盘访 ...

  9. [Operating System Labs] 我对Linux0.00中 head.s 的理解和注释

    ?21,#  head.s contains the 32-bit startup code.#  head.s 是32位的启动代码 #  Two L3 task multitasking. The ...

  10. 在什么情况下使用struct,struct与class的区别

    Struct定义和使用 类是引用类型,是保存在托管堆中的.通过定义类,我们可以在数据的生存期上得到很高的灵活性,但是也会让程序的性能有一定的损失.虽然这种损失很小,但当我们只需要定义一个很小的结构时, ...