ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷1282 多米诺骨牌

2019-01-30 20:48:12  阅读:335  来源: 互联网

标签:多米诺骨牌 1282 int s2 s1 min sum1 洛谷 1010


  是传送门啊

 

又是一道时隔多年不太会写的题qwq

 

思路:

  想了一会 觉得可以设f[i][j]为前i个牌旋转j次的最小上下点数差

  但是这样好像又不对 因为这个局部最优并不一定可以得到全局最优啊

  于是又想了想 终于唤起了原来写这道题的记忆

  令f[i][j]为前i张牌 上面的骨牌点数和为j的最小旋转次数

 

CODE:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int a[1010],b[1010];//a:上 ;b:下 
 5 int f[1010][6010];
 6 int main()
 7 {
 8     int n,s=0,s1=0,s2=0,sum1;
 9     cin>>n;
10     for(int i=1;i<=n;i++)
11     {
12         cin>>a[i]>>b[i];
13         s+=a[i]+b[i];
14         s1+=a[i];
15         s2+=b[i];
16     }
17     sum1=abs(s1-s2);
18     for(int i=1;i<=n;i++)
19     {
20         for(int j=0;j<=6*n;j++)
21         f[i][j]=210000000;
22     }
23     f[1][a[1]]=0;f[1][b[1]]=1;
24     for(int i=2;i<=n;i++)
25     {
26         for(int j=1;j<=i*6;j++)
27         {
28             if(j>a[i]) f[i][j]=min(f[i][j],f[i-1][j-a[i]]);
29             if(j>b[i]) f[i][j]=min(f[i][j],f[i-1][j-b[i]]+1);
30         } 
31     }
32     int mins=210000000,mint=210000000;
33     for(int i=0;i<=6*n;i++)
34     {
35         if(f[n][i]!=210000000)
36         {
37             int sum=abs(s-i-i);
38             if(sum<mins)
39             {
40                 mins=sum;
41                 mint=f[n][i];
42             }
43             if(sum==mins&&f[n][i]<mint) mint=f[n][i];
44         }
45     }
46     if(mins>=sum1) cout<<0;
47     else cout<<mint;
48     return 0;
49 } 
贴上以前的code啊

 

标签:多米诺骨牌,1282,int,s2,s1,min,sum1,洛谷,1010
来源: https://www.cnblogs.com/forward777/p/10339753.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有