POJ1717-Dominoes

这道题..........我不作任何评价【看题】

【题目描述】

 多米诺骨牌是一个扁平的,有拇指的瓷砖,其面部分为两个正方形,每个正方形留空或带有一到六个点。桌子上摆着一排多米诺骨牌: 

 顶行中的点数是6 + 1 + 1 + 1 = 9,并且底行中的点数是1 + 5 + 3 + 2 = 11。顶行和底行之间的差值为2.差值是两个总和之差的绝对值。 
 每个多米诺骨牌都可以旋转180度,保持脸部始终向上。 
 最小化顶行和底行之间的差值所需的最小翻动次数是多少? 
 对于上图,只需转动行中的最后一个多米诺骨牌就可以将差值减小到0.在这种情况下,答案是1. 
 编写一个程序:计算最小化差值所需的最小翻动次数。

【输入】

 输入的第一行包含一个整数n,1 <= n <= 1000.这是表中列出的多米诺骨牌的数量。 
 接下来的n行中的每一行包含两个整数a,b由单个空格分隔,0 <= a,b <= 6.整数a和b写在输入文件的行i + 1中,1 <= i < = 1000,分别是顶行和底行的第i个多米诺骨牌上的点数。
 

【输出】

 输出所需的最小翻转次数,以最小化顶线和底线之间的间隙。

【输入示例】

4
6 1
1 5
1 3
1 2

【输出示例】

 1

 

这道题讲真一开始我在那傻fufu的用深搜做,样例过了但交上去还是WA(呵呵)

然后我们信息社的戴佬(手动@DJY_01跟我说这道题要用动规。

真是个Big Sprice哦。(竖中指)

这道题其实就是个变相的01背包。

因为每个多米诺骨牌有翻和不翻两个选项。对应着01背包里的放和不放。

前i个背包总共值j点=dp[i][j]

ans=骨牌顶行-骨牌底行

不翻=dp[i-1][j-ans]

翻=dp[i-1][j-(-ans)]+1=dp[i-1][j+ans]+1

动规方程:dp[i][j]=min(dp[i-1][j-ans],dp[i-1][j+ans]+1)。代码如下:

1 for(int i=1;i<=n;i++)
2     {
3         for(int j=0;j<=12000;j++)
4         {
5             int cha=up[i]-down[i];
6             dp[i][j]=min(dp[i-1][j-cha],dp[i-1][j+cha]+1);
7         }
8     }

然后因为j可以是负数,所以实际上的0是dp[i][6000]。

然后在绝对值相同的情况下,看正数和负数哪个翻转次数少。

1 for(int i=0;i<=6000;i++)
2     {
3         int ans=min(dp[n][i+6000],dp[n][6000-i]);
4         if(ans<=1000)
5         {
6             cout<<ans;
7             exit(0);
8         }
9     }

全部代码:

 1 #include<iostream>
 2 using namespace std;
 3 int n;
 4 int up[1013],down[1013];
 5 int dp[1013][12013];
 6 int main()
 7 {    
 8     cin>>n;
 9     for(int i=1;i<=n;i++)
10     {
11         cin>>up[i]>>down[i];
12     }
13     memset(dp,0x7f,sizeof(dp));
14     dp[0][6000]=0;
15     for(int i=1;i<=n;i++)
16     {
17         for(int j=0;j<=12000;j++)
18         {
19             int cha=up[i]-down[i];
20             dp[i][j]=min(dp[i-1][j-cha],dp[i-1][j+cha]+1);
21         }
22     }
23     for(int i=0;i<=6000;i++)
24     {
25         int ans=min(dp[n][i+6000],dp[n][6000-i]);
26         if(ans<=1000)
27         {
28             cout<<ans;
29             exit(0);
30         }
31     }
32 } 

动规背包,完成。

在此鸣谢戴佬给我的帮助(博客名DJY_01)

 

在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹。

posted @ 2018-08-09 10:44  Darkness_ly  阅读(287)  评论(0编辑  收藏  举报