HDU 3757 dp
来源:互联网 发布:西蒙智力量表软件 编辑:程序博客网 时间:2024/04/30 11:02
#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>using namespace std;const int maxn = 4E3 + 10;const long long INF = 1LL << 60;short path[maxn][maxn];long long f[maxn];struct Node{ long long d; int num, sh;};int n, m, T, kase;Node x[maxn], y[maxn];bool cmpd(const Node &a, const Node &b){ return a.d < b.d;}bool cmpnum(const Node &a, const Node &b){ return a.num < b.num;}void solve(int i, int j){ if (i != 1) solve(i - 1, path[i][j]); x[i].sh = y[j].num;}int main(int argc, char const *argv[]){ scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%I64d", &x[i].d), x[i].num = i; scanf("%d", &m); for (int i = 1; i <= m; i++) scanf("%I64d", &y[i].d), y[i].num = i; sort(x + 1, x + 1 + n, cmpd); sort(y + 1, y + 1 + m, cmpd); for (int i = 0; i <= max(n, m); i++) f[i] = INF; f[1] = abs(x[1].d - y[1].d); for (int i = 2; i <= n; i++) for (int j = min(i, m); j >= 1; j--) { if (f[j] < f[j - 1]) { f[j] = f[j] + abs(x[i].d - y[j].d); path[i][j] = j; } else { f[j] = f[j - 1] + abs(x[i].d - y[j].d); path[i][j] = j - 1; } } printf("%I64d\n", f[m]); solve(n, m); sort(x + 1, x + 1 + n, cmpnum); for (int i = 1; i < n; i++) printf("%d ", x[i].sh); printf("%d\n", x[n].sh); } return 0;}
分别对人和shelter从小到大排序之后再dp,这样可以消除后效性。
设f[i][j]表示第i个人放在第j个遮蔽物里,则有:f[i][j]=min(f[i-1][j],f[i-1][j-1])+abs(x[i]-y[j]);
0 0
- HDU 3757 dp
- HDU DP
- DP? HDU
- DP? HDU
- DP? HDU
- 【dp】HDU
- 【dp】HDU
- 【dp】 HDU
- DP? HDU
- HDU 1003 && HDU 1231 DP
- hdu 1058 DP
- HDU 1069 dp
- HDU 1024(DP)
- hdu 1257 dp+贪心
- HDU 1087(DP)
- HDU 1506(DP)
- hdu 2844 DP 背包
- HDU 1087 简单DP
- [LeetCode#4][C]Median of Two Sorted Arrays
- JAVA两个字符串截取相同的最长子字符串
- ISA TEST黑客过关小游戏第六关解密
- Fragment中的onActivityResult方法不调用
- discuz和phpwind哪个好
- HDU 3757 dp
- Java并发(三) ThreadLocal关键字
- 保护古文化遗产海报
- SQLSERVER2008服务无法启动
- Android——Matrix变换矩阵的探索(1)
- Android自定义View的一般步骤
- Android BroastCast的使用详解
- hdoj--3491--Thieves(最小割点集)
- Jboss5.1类加载及配置文件读取解密