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

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

这道题要求我们在差最小的情况下反转次数最少。我们用dp[i][j]表示选取前i个股票,差值为j的最小反转。因为差最小是优先条件,所以我们完全可以找到最接近某一个值的点,取其最小反转次数。

那么dp[i][j] = min(dp[i-1][j+a[i]],dp[i-1][j-a[i]]+1),其中a[i]表示第i块骨牌上下点数之差(不是绝对值!!),所以你在取相反数的时候相当于反了过来。至于怎么解决负数的问题,好办,数据波动不超过5000,所以只要设置一个中间值(比如6000),把它设为开始开始DP,最后找一个最接近的即可。

看一下代码。

#include
#include
#include
#include
#include
#include
#include
#define rep(i,a,n) for(int i = a;i <= n;i++)#define per(i,n,a) for(int i = n;i >= a;i--)#define enter putchar('\n')using namespace std;typedef long long ll;const int M = 20005;const int INF = 1000000009;int read(){ int ans = 0,op = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { ans *= 10; ans += ch - '0'; ch = getchar(); } return ans * op;}int n,k,a[M],dp[1005][12005],x,y,minn = INF,ans;int main(){ n = read(); rep(i,1,n) x = read(),y = read(),a[i] = x - y; rep(i,0,n) rep(j,0,12000) dp[i][j] = INF; dp[0][6000] = 0; rep(i,1,n) { rep(j,1000,11000) { dp[i][j] = min(dp[i][j],dp[i-1][j+a[i]]); dp[i][j] = min(dp[i][j],dp[i-1][j-a[i]]+1); } } rep(j,1000,11000) { if(dp[n][j] == INF) continue; if(abs(6000 - j) < minn) minn = abs(6000-j),ans = dp[n][j]; } printf("%d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/captain1/p/9859325.html

你可能感兴趣的文章
归并排序
查看>>
机器视觉:SSD Single Shot MultiBox Detector
查看>>
走遍美国 —— 各州及其别名
查看>>
国内外免费电子书(数学、算法、图像、深度学习、机器学习)
查看>>
狄利克雷过程(Dirichlet Process)
查看>>
五子棋项目的实现(二)博弈树算法的描述
查看>>
Hibernate : Disabling contextual LOB creation as createClob() method threw error
查看>>
【bzoj4872】[Shoi2017]分手是祝愿 期望dp
查看>>
字符串元转分
查看>>
thinkphp 防sql注入
查看>>
201521123044 《Java程序设计》第1周学习总结
查看>>
MIT Scheme 的基本使用
查看>>
程序员的“机械同感”
查看>>
在16aspx.com上下了一个简单商品房销售系统源码,怎么修改它的默认登录名和密码...
查看>>
c++回调函数
查看>>
linux下Rtree的安装
查看>>
【Java】 剑指offer(53-2) 0到n-1中缺失的数字
查看>>
Delphi中ListView类的用法
查看>>
bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
查看>>
[原创]Java 的传值小例子
查看>>