poj 3666 Making the Grade dp 离散化
2015-11-08 20:23
423 查看
题目
题目链接:http://poj.org/problem?id=3666题目来源:《挑战》练习题
简要题意:求BB令∑i=1N|Ai−Bi|\sum\limits_{i=1}^N{|A_i-B_i|}最小且BB非严格单调递增或递减。
数据范围:1⩽N⩽2000;0⩽Ai⩽1091\leqslant N\leqslant 2000;\quad 0 \leqslant A_i \leqslant 10^9
题解
这题一开始想歪了,想着去怎么扫之前的去转移,然后想不出。后来想着换个思路,用值来dpdp,由于BB中取AA中没有的值的话可以代价更小,所以只需要考虑其中的值。
以非严格单增为例子,dp[i][j]dp[i][j]为前ii个构成Bi=jB_i=j的非严格单增的最小代价。
可得转移方程:dp[i][j]=mink=0j(dp[i−1][k])dp[i][j]=\min\limits_{k=0}^j(dp[i-1][k])
只要临时保存个变量就能线性求出了。
同理非严格单减的话有:dp[i][j]=mink=jmaxi=1N(Ai)(dp[i−1][k])dp[i][j]=\min\limits_{k=j}^{\max\limits_{i=1}^N(A_i)}(dp[i-1][k])
实现
由于AiA_i较大,需要进行离散化再去搞。听说数据有问题,只需要去搞非严格单增的就行了。
代码
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <queue> #include <string> #include <vector> #include <set> #include <map> #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define fi first #define se second using namespace std; typedef long long LL; typedef vector<int> VI; typedef pair<int,int> PII; LL powmod(LL a,LL b, LL MOD) {LL res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;} // head const int N = 2005; const int INF = 0x3f3f3f3f; int dp ; int a ; int dis ; int n, m; int dpinc() { for (int i = 1; i <= n; i++) { int minv = dp[i-1][0]; for (int j = 0; j < m; j++) { minv = min(minv, dp[i-1][j]); dp[i][j] = minv + abs(dis[a[i]]-dis[j]); } } int ans = dp [0]; for (int i = 1; i < m; i++) { ans = min(ans, dp [i]); } return ans; } int dpdec() { for (int i = 1; i <= n; i++) { int minv = dp[i-1][m-1]; for (int j = m-1; ~j; j--) { minv = min(minv, dp[i-1][j]); dp[i][j] = minv + abs(dis[a[i]]-dis[j]); } } int ans = dp [0]; for (int i = 1; i < m; i++) { ans = min(ans, dp [i]); } return ans; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", a+i); dis[i] = a[i]; } sort(dis, dis+n); m = unique(dis, dis+n)-dis; for (int i = 1; i <= n; i++) { a[i] = lower_bound(dis, dis+m, a[i])-dis; } printf("%d\n", min(dpinc(), dpdec())); return 0; }
相关文章推荐
- iOS开发:设计模式那点事
- 第九周 第十章学习
- Android.view.inflateException :binary xml file line #2:Error inflating class
- 在Win7 64位上安装mySQL5.1和Navicat10.0
- java web 一行代码实现文件上传下载
- Intellij IDEA & Android Studio IDE自己风格的配置
- super一些要点
- iOS导航条和工具条
- VS插件-GetSet生成器
- HDOJ 5240 Exam 【简单模拟】
- Java集合框架
- HDU 1401 Solitaire
- 参加微软黑客马拉松经历
- 使用VS2010调用QtDesigner设计的UI文件,并实现控件功能
- 程序员如何编写好开发技术文档 如何编写优质的API文档工作
- Linux下搭LNMP
- 带环单链表
- java中leetcode题目求字符创匹配的问题
- 关于使用Git&Bitbucket的一些Tips
- 线程的互斥