博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多米诺骨牌
阅读量:4332 次
发布时间:2019-06-06

本文共 1465 字,大约阅读时间需要 4 分钟。

结合两篇题解:

有了我这篇博客。

主要思路是题解1。初始时先将所有骨牌翻转成上边的点数大,假设这时上下点数之差为\(tot\),此时翻转的骨牌数记为\(base\)。那么现在要再次翻转骨牌使得差值变小,假设第\(i\)张骨牌上下差值为\(k\),那么将这张骨牌翻转过来差值会减小\(2*k\)。明显最终差值会减到负值。当差值减到0时是最优答案。将减小的差值统一加上\(tot\),那么差值越接近\(tot\),答案越优。取所有差值减去\(tot\)的绝对值最小的一个便是答案。要注意减小的差值可能有0的情况(第10个点)。

#include
#include
#include
#include
using namespace std;const int N = 1005;int dp[N][N*6],w[N],v[N],n,tot,base,tot1,ansp,ans=2147483647;bool vs[N][N*6];int main(){ ansp=2147483647; int x,y; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); tot1+=x-y; if(x>y) { v[i]=2*(x-y); w[i]=1; tot+=x-y; } if(y>x) { v[i]=2*(y-x); w[i]=-1; tot+=y-x; base++; } } for(int i=1;i<=n;i++) for(int j=0;j<=tot+tot;j++) { dp[i][j]=dp[i-1][j]; vs[i][j]=vs[i-1][j]; if(vs[i-1][j-v[i]]||j-v[i]==0) { if(!vs[i][j]) { dp[i][j]=dp[i-1][j-v[i]]+w[i]; vs[i][j]=1; } else dp[i][j]=min(dp[i][j],dp[i-1][j-v[i]]+w[i]); } } for(int i=0;i<=tot+tot;i++) if(vs[n][i]) { if(abs(i-tot)==ans) ansp=min(ansp,dp[n][i]); if(abs(i-tot)

最开始的思路和第二篇博客里的思路一一样,但这种思路是不行的。加入当前枚举到\((i,j)\),有一个答案为\(a\),一个答案为\(-a\),无法判断在以后的转移中那个更优。

思路二值得借鉴,但是没写。

转载于:https://www.cnblogs.com/karryW/p/11385708.html

你可能感兴趣的文章
VsVim - Shortcut Key (快捷键)
查看>>
C++练习 | 模板与泛式编程练习(1)
查看>>
HDU5447 Good Numbers
查看>>
08.CXF发布WebService(Java项目)
查看>>
java-集合框架
查看>>
RTMP
查看>>
求一个数的整数次方
查看>>
点云PCL中小细节
查看>>
铁路信号基础
查看>>
RobotFramework自动化2-自定义关键字
查看>>
[置顶] 【cocos2d-x入门实战】微信飞机大战之三:飞机要起飞了
查看>>
BABOK - 需求分析(Requirements Analysis)概述
查看>>
第43条:掌握GCD及操作队列的使用时机
查看>>
Windows autoKeras的下载与安装连接
查看>>
CMU Bomblab 答案
查看>>
微信支付之异步通知签名错误
查看>>
2016 - 1 -17 GCD学习总结
查看>>
linux安装php-redis扩展(转)
查看>>
Vue集成微信开发趟坑:公众号以及JSSDK相关
查看>>
技术分析淘宝的超卖宝贝
查看>>