递推DP UVA 1424 Salesmen
/*
题意:给定包含n个点的无向图和一个长度为L的序列,修改尽量少的点使得相邻的数字相同或连通
DP:状态转移方程:dp[i][j] = min (dp[i][j], dp[i-1][k] + (j != a[i]));
dp[i][j]表示前i个数字以j结尾的最小花费。我自己写了很长时间,很复杂,状态转移的不好。
应该能知道前一个状态的所有情况,每一维数组记录的就是一个状态
*/
/************************************************
Author :Running_Time
Created Time :2015-8-5 9:03:34
File Name :UVA_1424.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e2 + ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + ;
bool con[MAXN][MAXN];
int a[MAXN*];
int dp[MAXN*][MAXN];
int n1, m, n; int work(void) {
memset (dp, INF, sizeof (dp));
for (int i=; i<=n1; ++i) {
dp[][i] = (i != a[]);
}
for (int i=; i<=n; ++i) {
for (int j=; j<=n1; ++j) {
for (int k=; k<=n1; ++k) {
if (con[j][k]) {
dp[i][j] = min (dp[i][j], dp[i-][k] + (j != a[i]));
}
}
}
}
int res = INF;
for (int i=; i<=n1; ++i) {
res = min (res, dp[n][i]);
} return res;
} int main(void) { //UVA 1424 Salesmen
int T; scanf ("%d", &T);
while (T--) {
scanf ("%d%d", &n1, &m);
memset (con, false, sizeof (con));
for (int i=; i<=n1; ++i) con[i][i] = true;
for (int i=; i<=m; ++i) {
int u, v; scanf ("%d%d", &u, &v);
con[u][v] = con[v][u] = true;
}
scanf ("%d", &n);
for (int i=; i<=n; ++i) {
scanf ("%d", &a[i]);
} printf ("%d\n", work ());
} return ;
}
/************************************************
Author :Running_Time
Created Time :2015-8-5 9:03:34
File Name :UVA_1424.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e2 + ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + ;
bool con[MAXN][MAXN];
vector<int> G[MAXN];
vector<int> pre;
int a[MAXN*];
int dp[MAXN][][MAXN];
int n1, m, n; int work(void) {
memset (dp, INF, sizeof (dp)); pre.clear ();
dp[][][a[]] = ;
for (int i=; i<=n1; ++i) {
if (i == a[]) continue;
pre.push_back (i);
dp[][][i] = ;
}
for (int i=; i<=n; ++i) {
if (con[a[i-]][a[i]]) {
dp[i][][a[i]] = dp[i-][][a[i-]];
pre.clear (); continue;
}
vector<int> tmp;
for (int j=; j<pre.size (); ++j) {
int u = pre[j];
for (int k=; k<G[u].size (); ++k) {
int v = G[u][k];
if (con[u][v]) {
if (v == a[i]) dp[i][][v] = min (dp[i][][v], dp[i-][][u]);
else dp[i][][v] = min (dp[i][][v], dp[i-][][u] + );
tmp.push_back (v);
}
}
}
pre.clear ();
for (int j=; j<tmp.size (); ++j) pre.push_back (tmp[j]);
} int res = INF;
res = min (res, dp[n][][a[n]]);
for (int i=; i<pre.size (); ++i) {
int v = pre[i];
res = min (res, dp[n][][v]);
} //debug
for (int i=; i<=n; ++i) {
printf ("%d ", dp[i][][a[i]]);
}
puts (""); return res;
} int main(void) {
int T; scanf ("%d", &T);
while (T--) {
scanf ("%d%d", &n1, &m);
memset (con, false, sizeof (con));
for (int i=; i<=n1; ++i) G[i].clear ();
for (int i=; i<=n1; ++i) con[i][i] = true;
for (int i=; i<=m; ++i) {
int u, v; scanf ("%d%d", &u, &v);
con[u][v] = con[v][u] = true; G[u].push_back (v); G[v].push_back (u);
}
scanf ("%d", &n);
for (int i=; i<=n; ++i) {
scanf ("%d", &a[i]);
} printf ("%d\n", work ());
} return ;
}
undone(感受一下就行了)
递推DP UVA 1424 Salesmen的更多相关文章
- 递推DP UVA 607 Scheduling Lectures
题目传送门 题意:教授给学生上课,有n个主题,每个主题有ti时间,上课有两个限制:1. 每个主题只能在一节课内讲完,不能分开在多节课:2. 必须按主题顺序讲,不能打乱.一节课L时间,如果提前下课了,按 ...
- 递推DP UVA 1366 Martian Mining
题目传送门 /* 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 到达边界后把沿途路上的权值相加求和使最大 DP:这是道递推题,首先我题目看了老 ...
- 递推DP UVA 1291 Dance Dance Revolution
题目传送门 题意:给一串跳舞的动作,至少一只脚落到指定的位置,不同的走法有不同的体力消耗,问最小体力消费多少分析:dp[i][j][k] 表示前i个动作,当前状态(j, k)的最小消费,状态转移方程: ...
- 递推DP UVA 590 Always on the run
题目传送门 题意:题意难懂,就是一个小偷在m天内从城市1飞到城市n最小花费,输入的是每个城市飞到其他城市的航班. 分析:dp[i][j] 表示小偷第i天在城市j的最小花费.状态转移方程:dp[i][j ...
- 递推DP UVA 473 Raucous Rockers
题目传送门 题意:n首个按照给定顺序存在m张光盘里,每首歌有播放时间ti,并且只能完整的存在一张光盘里,问最多能存几首歌 分析:类似01背包和完全背包,每首歌可存可不存,存到下一张光盘的情况是当前存不 ...
- 递推DP URAL 1167 Bicolored Horses
题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状 ...
- 递推DP URAL 1017 Staircases
题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转 ...
- 递推DP URAL 1260 Nudnik Photographer
题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> ...
- 递推DP URAL 1353 Milliard Vasya's Function
题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k] ...
随机推荐
- 面向对象:继承(经典类&新式类继承原理、属性查找)、派生
继承: 继承是指类与类之间的关系,是一种“什么”是“什么”的关系. 继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基 ...
- QQ - Linux中文Wiki
QQ:http://linux-wiki.cn/wiki/zh-hans/QQ 此页由张凯于2013年7月7日 (星期日) 14:00的最后更改. 在陈泓旭和沧之声和Linux Wiki用户Chenx ...
- P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
https://www.luogu.org/problem/show?pid=2910 题目描述 Farmer John is on a boat seeking fabled treasure on ...
- Letter Combinations of a Phone Number(带for循环的DFS,组合问题,递归总结)
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- chdoj38 K-partite Graph(补图)
题意: 若一个无向图G的节点能够分成k(k>=2)个非空集合,对于每对点,当且仅当他们属于不同的集合,存在一条边(ui,vi)连接他们.那么这个图就是一个完全k分图. 现在给出一个n点,m条边的 ...
- 简谈Java传值传引用
本随笔旨在强化理解传值与传引用 如下代码的运行结果 其中i没有改变,s也没有改变. 但model中的值均改变了. i :100s :hellomodel :testchangemodel2 :ch ...
- Erlang 又生虫了
好久不玩Erlang了.近期想鼓捣Eresye,下了个最新版OTP 17,结果.发现了问题. 安装这个最新版的Erlang (erl 6.0)后,用erlc编译了Eresye 1.2.5,并放入其li ...
- EJB之JPA
在前一篇文章中大概了解了EJB是什么?那么接下来就进一步介绍一下它与JPA有什么样的关系?及什么是JPA?JPA怎样用? 一.是什么? 第一次听说JPA是在EJB视屏中,所以一直感觉他们有不解的渊源. ...
- HDU 5324 Boring Class【cdq分治】
这就是一个三维排序的问题,一维递减,两维递增,这样的问题用裸的CDQ分治恰好能够解决. 如同HDU 4742(三维排序,一个三维都是递增的) 由于最小字典序比較麻烦,所以要从后面往前面做分治.每一个点 ...
- UVA 1397 - The Teacher's Side of Math(高斯消元)
UVA 1397 - The Teacher's Side of Math 题目链接 题意:给定一个x=a1/m+b1/n.求原方程组 思路:因为m*n最多20,全部最高项仅仅有20.然后能够把每一个 ...