递推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] ... 
随机推荐
- 【bzoj3747】[POI2015]Kinoman - 线段树(经典)
			Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ... 
- csu - 1537: Miscalculation (模拟题)
			http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1537 因为给出的式子是必定合法的,只要用两个栈分别保存符号和数字.算出答案后和从左至右算的答案比对 ... 
- Ubuntu 16.04安装unrar解压RAR文件
			除了7zip:http://www.cnblogs.com/EasonJim/p/7124306.html之外,还可以安装unrar进行解压RAR文件. 安装 sudo apt-get install ... 
- Orcle定时生成表数据作业
			--建表 create table table41( id ) not null, --主键 col1 ), col2 ), col3 ), col4 int, col5 timestamp, col ... 
- CentOS 5.5 介绍
			转载:http://www.osyunwei.com/archives/3625.html 操作系统:CentOS 5.5主机名称:wwwIP地址:192.168.21.128网关:192.168.2 ... 
- Android Studio 1.x 使用问题汇总
			Android Studio是谷歌于13年I/O大会推出的Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的Androi ... 
- yarn-cli 添加
			添加依赖包 当你想使用另一个包时,你要先把它添加到依赖列表中.也就是执行 yarn add [package-name] 命令将它安装到你的项目中. 这也将同时更新你的 package.json 和 ... 
- windows server 证书的颁发与IIS证书的使用    Dapper入门使用,代替你的DbSQLhelper    Asp.Net MVC中Action跳转(转载)
			windows server 证书的颁发与IIS证书的使用 最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选 ... 
- hiho一下 第五十一周(有向图欧拉路径)51
			//////////////////////////////////////////////////////////////////////////////////////////////////// ... 
- java设计模式 -------- 行为模式 之 策略模式(4)
			[本文是自己学习所做笔记.欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 上面3节实现了从最初的对整形数组排序到最后能够对全部类型都能够依据须要定义自 ... 
