题目传送门

 /*
题意:给定包含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(感受一下就行了)

最新文章

  1. OuNews 简单的新闻客户端应用源码
  2. EF实体框架数据操作基类(转)
  3. CentOS6.5(Python-2.7.12)安装Pip
  4. P1024 外星人的密码数字
  5. 绘图时,根据size()和自定义rect编程的区别
  6. DIV + CSS 盒子模型
  7. 解决angular 与django的冲突
  8. MVC 分页1 标准的url分页
  9. Hadoop 2.7 伪分布式环境搭建
  10. Go的变量作用域
  11. MySQL常见备份方案
  12. popup_layer插件示例
  13. 2018开源中国最受欢迎的中国软件MyBatis-Plus
  14. weexpack打包weex项目运行/打包记录
  15. Oracle调整顾问(SQL Tuning Advisor 与 SQL Access Advisor
  16. api测试工具
  17. Java Day26进程01天
  18. C# 数字证书 RSA加密解密 加签验签
  19. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码
  20. Grunt 使用(二)uglify插件压缩javascript代码

热门文章

  1. node的express框架,核心第三方模块body-parser 获取我们所有post请求传过来数据
  2. hdu4696 Answers(循环节+找规律)
  3. &lt;项目&gt;&lt;day11&gt;查看用户浏览过的商品
  4. 洛谷 P1457 城堡 The Castle
  5. centos 命令行中 * 和 . 的区别
  6. Samba完整篇 ubuntu 10.04
  7. js逻辑执行判断
  8. php高效获取数据分页
  9. java中a++和++a在较复杂的运算中分析
  10. mybatis之if else语句