1073. Pearls
2011-05-02 10:52 Min·zc 阅读(130) 评论(0) 编辑 收藏 举报之前用的是贪心来做,对于这组数据就出错了
10,10
5,15
10,23
看了一下别人的想法,用的是动态规划
具体的题解移步这里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 }