递推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] ...
随机推荐
- socketserver模块使用 & websocket
socketserver: socketserver可用于实现并发通信. socketserver 模块简化了编写网络服务程序的任务:同时 SocketServer 模块也是 Python标准库中很多 ...
- Spring Boot Jpa 表名小写转大写
今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和 AC ...
- codevs 3971 航班
题目描述 Description B 国有N 座城市,其中1 号是这座国家的首都. N 座城市之间有M 趟双向航班.i 号点的转机次数定义为:从1 号点到i ,最少需要转机几 次.如果1 根本无法到达 ...
- zset(sorted set:有序集合)数据类型【八】
一.概述:(zset) Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数 ...
- 51 nod 1007 正整数分组 (简单01背包) && csu 1547: Rectangle
http://www.51nod.com/onlineJudge/questionCode.html#problemId=1007¬iceId=15020 求出n个数的和sum,然后用s ...
- Java电商项目-6.实现门户首页数据展示_Redis数据缓存
目录 项目的Github地址 需求介绍 搭建Redis集群环境 下面先描述单机版redis的安装 下面将进行Redis3主3从集群环境搭建 基于SOA架构, 创建门户ashop-portal-web门 ...
- 洛谷 P1608 路径统计
P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...
- HAProxy教程收集
市面上HA的教程不是很多,基本都是基于LVS+HA实践的打包资料. 要最权威的文档应该去官方. 官方文档入口: http://www.haproxy.org/#docs 中文文档收集: http:// ...
- JDBC的事务
以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/transactions.html: 如果JDBC连接是处于自动提交模式下,该模式为默认模式,那么每句S ...
- 我的arcgis培训照片10
来自:http://www.cnblogs.com/gisoracle/p/4297439.html