递推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] ...
随机推荐
- msp430入门学习23
msp430的ADC(模数转换) msp430入门学习
- MeepoPS基本使用方法
MeepoPS基本使用 MeepoPS是Meepo PHP Socket的缩写. 旨在提供高效稳定的由纯PHP开发的多进程SocketService. MeepoPS可以轻松构建在线实时聊天, 即时游 ...
- hdu_1398_Square Coins_201404260953
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- ArcGIS for Android离线数据编辑实现原理
来自:http://blog.csdn.net/arcgis_mobile/article/details/7565877 ArcGIS for Android中现已经提供了离线缓存图片的加载功能,极 ...
- 我的arcgis培训照片3
来自:http://www.cioiot.com/successview-557-1.html
- Mysql中错误日志、binlog日志、查询日志、慢查询日志简单介绍
前言 数据库的日志是帮助数据库管理员,追踪分析数据库以前发生的各种事件的有力根据.mysql中提供了错误日志.binlog日志(二进制日志).查处日志.慢查询日志.在此,我力求解决下面问题:各个日志的 ...
- Kafka单机Windows环境搭建
Kafka单机Windows环境搭建 1,安装jdk1.8:安装目录不能有中文空格: 2,下载zookeeper,https://mirrors.cnnic.cn/apache/zookeeper/z ...
- psychology
壹.自身(荣.命) 一.职业分析 ㈠.分析性格→分析长处和短处→分析大家都有的长处→确定自己最终发展的专业. 1 .性格--宗正 耐压力特强,即使肩头责任重大,也能够处理得稳稳当当,是 ...
- 手动脱RLPack壳实战
作者:Fly2015 吾爱破解论坛培训第一课选修作业练习的第7题. 这个壳没听说过.可是脱起来比較简单.依据ESP定律就可以直达光明,Dump出原来的程序. 老规矩.首先对须要脱壳的程序进行查壳处理. ...
- AutoCAD如何方便截图放到Word文档,改成白底黑字
将模型视图切换到布局2即可 比如下图所示的效果 先回到模型视图把所有线条颜色都改成白色,然后添加适当的标注(比如要受力分析,则在CAD中绘制箭头也很方便的),文字说明.然后切换到布局2就OK ...