UVALive 4256 Salesmen 【简单dp】
2016-03-26 15:30
309 查看
题意:给你一棵树,和一串序列,求最少改变多少个数使得序列中的每个相邻的数要么相等要么在树上相邻。
分析:设状态dp[i][j]表示长度为i以j结尾最少修改几次合法。
转移dp[i][k]=min(dp[i][k],dp[i-1][j]+(a[i]!=k)) k是当前最后数字,j是k前一个,j可以等于k(处理与前面相等),若j与k在树上相邻,判断a[i]!=k,dp[i][k]+1;
代码:
分析:设状态dp[i][j]表示长度为i以j结尾最少修改几次合法。
转移dp[i][k]=min(dp[i][k],dp[i-1][j]+(a[i]!=k)) k是当前最后数字,j是k前一个,j可以等于k(处理与前面相等),若j与k在树上相邻,判断a[i]!=k,dp[i][k]+1;
代码:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<queue> #include<cmath> #include<stack> #include<set> #include<map> #define INF 0x3f3f3f3f #define Mn 105 #define Mm 200 #define mod 1000000007 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul u<<1 #define ur (u<<1)|1 using namespace std; typedef long long ll; int a[Mm]; int dp[Mm][Mn]; int g[Mn][Mn]; int main() { int n,m,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); CLR(g,0); while(m--) { int u,v; scanf("%d%d",&u,&v); g[u][v]=g[v][u]=1; } scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) g[i][i]=1; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) dp[i][j]=INF; for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) if(g[j][k]) dp[i][k]=min(dp[i][k],dp[i-1][j]+(a[i]!=k)); } int ans=m; for(int i=1;i<=n;i++) ans=min(dp[m][i],ans); printf("%d\n",ans); } return 0; }
相关文章推荐
- 利用TouchesBegan解决页面内 触摸 某个视图以外的处理的情况
- 数组元素的赋值和遍历数组
- 数据统计
- Linux 版本查询
- 定位详解、层级、滤镜遮罩笔记
- 收到用980C币在C商城买的CSDN徽标保温杯
- 连接池技术BoneCP
- Android设计模式之原型模式
- 公司间采购的后台配置备忘录
- 质数因子
- 基于图的推荐算法——《推荐系统实践》
- Android中从ImageView中取出图片bitmap注意事项
- BZOJ 1806 IOI2007 Miners 矿工配餐 动态规划
- Java线程总结
- web界面设计中文字如何设计【太原UI设计师】分享
- 常见问题转载链接
- 代理模式
- 无法启动 Windows Event Log vpdn 无法启动 附带无法启动MYSQL服务”1067 进程意外终止”
- for 循环中植入两个变量
- Android studio 2.1 集成第三方短信验证类库