博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 1424 \ uvalive 4256 Salesmen 简单DP
阅读量:6656 次
发布时间:2019-06-25

本文共 1122 字,大约阅读时间需要 3 分钟。

题意:

给一个无向连通图,和一个长度为L的序列。任务是修改序列上的某些数使得每相邻两个数相等或在图上是两个相邻的点。最少需要修改几个数?

用dp[n][fa]表示当第n+1个数是fa时前n个数最少要修改几次

用邻接矩阵存图,补上g[i][i]=1;g[0][i]=1;就可以不用分别考虑相等和初始的状态了

dp[n][fa]=min{dp[n-1][v]+(v==an?0:1) | g[fa][v]==1 }

int g[110][110];int da[210];int dp[210][110];int f(int n,int fa,int N){    if(dp[n][fa]>=0)return dp[n][fa];    if(n==0)return 0;    int num=INF;    for(int i=1;i<=N;i++)    {        if(g[i][fa])        {            num=min(num,f(n-1,i,N)+(i==da[n]?0:1));        }    }    return dp[n][fa]=num;}int main(){    int t;    scanf("%d",&t);    for(int ca=1;ca<=t;ca++)    {        memset(g,0,sizeof(g));        int n1,n2;        scanf("%d%d",&n1,&n2);        for(int i=1;i<=n2;i++)        {            int a,b;            scanf("%d%d",&a,&b);            g[a][b]=g[b][a]=1;        }        for(int i=1;i<=n1;i++)g[0][i]=g[i][0]=1;        for(int i=1;i<=n1;i++)g[i][i]=1;        int n3;        scanf("%d",&n3);        for(int i=1;i<=n3;i++)scanf("%d",&da[i]);        memset(dp,-1,sizeof(dp));        int num=f(n3,0,n1);        printf("%d\n",num);    }    return 0;}
View Code

 

转载于:https://www.cnblogs.com/BMan/p/3250262.html

你可能感兴趣的文章
semaphore.h
查看>>
java学习笔记 --- 网络编程(套接字)
查看>>
tkinter 03 Listbox 列表部件
查看>>
Linux磁盘管理命令介绍
查看>>
一锤定音:高通(Qualcomm)370亿美元收购NXP,成为全球第一大汽车芯片供应商...
查看>>
JVM工作原理学习笔记
查看>>
windows 共享访问相关问题
查看>>
DC的sysvol目录管理!
查看>>
apache 防盗链 与 地址重写
查看>>
python3版本mysql的操作
查看>>
登录式shell与非登录式shell
查看>>
指针参数是如何传递内存的
查看>>
Server系列7:看win2012时代如何强制还原记录数据
查看>>
Linux下查看文件和文件夹大小 du df
查看>>
mongodb数据备份与恢复
查看>>
elf文件解析(cpp版)
查看>>
使用VS2010编译MongoDB C++驱动详解
查看>>
负载均衡(Load Balancing)学习笔记(三)
查看>>
Swing系统中实现帮助文档方法
查看>>
jquery设置和获得checkbox选中问题
查看>>