代码改变世界

1073. Pearls

2011-05-02 10:52  Min·zc  阅读(130)  评论(0编辑  收藏  举报

之前用的是贪心来做,对于这组数据就出错了

10,10

5,15

10,23

看了一下别人的想法,用的是动态规划

传送门http://soj.me/1073

具体的题解移步这里http://wenku.baidu.com/view/27cbabdb50e2524de5187ed3.html

证明连续性是为了保证动态规划方程的成立,如果连续性成立那么就是说明了子问题对于父问题没有影响。

连续性的具体解释如下

假设存在i,i+1,i+2三种珍珠,如果想要用高等级的珍珠代替低等级的珍珠,要么用i+2的代替i+1和i的,要么就只用i+1的代替i的,

不可以仅仅用i+2的代替i的,如果这样就不能保证最优解。

 

 1 #include <iostream>
 2 using namespace std;
 3 int ans[1010];
 4 int num[1010];
 5 int cl[1010];
 6 int main()
 7 {
 8         int t;
 9         cin>>t;
10         while(t--)
11         {
12                 int n;
13                 cin>>n;
14                 for(int i=1;i<=n;i++)
15                         cin>>num[i]>>cl[i];
16                 ans[0]=0;
17                 for(int i=1;i<=n;i++)
18                 {
19                         int min=99999999;
20                         for(int j=0;j<i;j++)
21                         {
22                                 int sum=0;
23                                 for(int k=j+1;k<=i;k++)
24                                         sum+=num[k];
25                                 if(ans[j]+(sum+10)*cl[i]<min)
26                                 {
27                                                 min=ans[j]+(sum+10)*cl[i];
28                                 }
29                         }
30                         ans[i]=min;
31                 }
32                 cout<<ans[n]<<endl;
33         }
34 }