LA 4256 DP Salesmen

d(i, j)表示使前i个数满足要求,而且第i个数值为j的最小改动次数。

d(i, j) = min{ d(i-1, k) | k == j | G[j][k] }

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 const int maxn = 200 + 10;
 7
 8 int n, m, k;
 9 int a[maxn];
10 int d[maxn][maxn];
11 bool G[maxn][maxn];
12
13 int main()
14 {
15     int T; scanf("%d", &T);
16     while(T--)
17     {
18         scanf("%d%d", &n, &m);
19         memset(G, false, sizeof(G));
20         while(m--)
21         {
22             int u, v; scanf("%d%d", &u, &v);
23             G[u][v] = G[v][u] = true;
24         }
25         scanf("%d", &k);
26         for(int i = 1; i <= k; i++) scanf("%d", a + i);
27
28         memset(d, 0x3f, sizeof(d));
29         for(int i = 1; i <= k; i++) d[0][i] = 0;
30         for(int i = 1; i <= k; i++)
31             for(int j = 1; j <= n; j++)
32                 for(int t = 1; t <= n; t++) if(G[j][t] || j == t)
33                     d[i][j] = min(d[i][j], d[i-1][t] + (j == a[i] ? 0 : 1));
34
35         int ans = k;
36         for(int i = 1; i <= n; i++) ans = min(ans, d[k][i]);
37         printf("%d\n", ans);
38     }
39
40     return 0;
41 }

代码君

时间: 2024-08-08 09:28:12

LA 4256 DP Salesmen的相关文章

LA 4256 Salesmen 线性dp

// LA 4256 Salesmen 线性dp // // 像LCS和LIS问题类似,因为每次修改一个值,都是根据 // 前一个值决定的,那么最后一个结尾的数字肯定要作为 // 状态,而长度作为状态是一目了然的 // // d[i][j]表示长度为i,最后以j结尾的数组修改的最小次数 // // 则状态转移方程为 // // d[i][j] = min(d[i][j],d[i-1][k]+(j,k是否相同或者相邻?0:1)); // // 个人感觉还是比较明显的,最后的答案就是min(d[L]

LA 4256

Traveling salesmen of nhn. (the prestigious Korean internet company) report their current location to the company on a regular basis. They also have to report their new location to the company if they are moving to another location. The company keep

uvalive 4256(dp)

题意:有从1到n的数字组成一个无向连通图,给出了连通情况,然后给出一个数字序列,问这个序列要求相邻的点要么相等要么在图中是直接连通的,问最少修改序列中的几个点可以让序列满足要求. 题解:f[i][j]表示前i个数组组成的序列以数字j结尾的最少修改点,那么f[i][j] = min{f[i][j],f[i - 1][k] + (d[i] != j)},此时j==k或g[j][k] == 1.最后f[len][k]所有数字过一遍选出最大值就可以了. #include <stdio.h> #incl

hdu5745--La Vie en rose (DP+bitset)

好题,学到新姿势! 题意:给两个字符串 a 和 b ,b可以进行变换,规则是可以任意交换相邻两个字符的位置,但是不可以有交叉(例如3和4交换,5和6交换 互不影响,但是2和3,3和4就不可以).求a中每一个位置能不能匹配b或b变幻得到的子串. 题解:考虑dp.dp[i][j][k]表示a[i]和b[j]匹配,k为1表示j未做交换,k=0表示j和j-1进行交换,k=2表示j和j+1进行交换. 这样写出来的代码: #include <iostream> #include <cstdio>

hdu 5763 Another Meaning 哈希+dp

Another Meaning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 917    Accepted Submission(s): 434 Problem Description As is known to all, in many cases, a word has two meanings. Such as “hehe”,

两道很好的dp题目【4.29考试】

A 问题描述: 对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用I表示,反之这个位置是下降的,用D表示.如排列3,1,2,7,4,6,5可以表示为DIIDID. 现在给出一个长度为n-1的排列表示,问有多少种1到n的排列满足这种表示. 输入: 一个字符串S,S由I,D,?组成.?表示这个位置既可以为I,又可以为D. 输出: 有多少种排列满足上述字符串.输出排列数模1000000007 样例输入: ?D 样例输出: 3 数据范围: 20%的数据 S长度<=10

poj 2264 Advanced Fruits(DP)

Advanced Fruits Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1944   Accepted: 967   Special Judge Description The company "21st Century Fruits" has specialized in creating new sorts of fruits by transferring genes from one fruit

poj3311(Hie with the Pie)状压dp

题目链接:http://poj.org/problem?id=3311 解法:标准的状压dp类型,先floyd获得两两之间最短距离.然后dp[i][j]表示剩下集合i没走,已经走到j的最短距离: 代码: /****************************************************** * @author:xiefubao *******************************************************/ #pragma comment(

Tyvj P1034 尼克的任务 (DP)

背景 Background 题库靠大家,人人都爱它. 描述 Description 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去写成,假如某些任务开始时刻尼克正在工作,则这些任务