HDU 6149 Valley Numer II (状压DP 易错题)
2024-09-08 15:54:32
题目大意:给你一个无向连通图(n<=30),点分为高点和低点,高点数量<=15,如果两个高点和低点都直接连边,那么我们称这三个点形成一个valley,每个点最多作为一个valley的组成部分,求valley的最大数量
高点状压,然后枚举低点,判断这个低点能否影响答案
注意:上一层的值要全都先赋给这一层,再枚举这一层,否则上一层的某些状态可能还没枚举到就枚举这一层了
(比如上一层可行的状态是0110,这一层新来了1001,我们要先把0110和1001赋给这一层,否则我们在从小到大先枚举0110时,这一层的状态0110以及1001并没有被上一层更新,导致转移出错
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 35
using namespace std; int T,n,m,K,cnt;
int d[N][N],up[N],dn[N],use[N];
int f[][(<<)+];
void clr()
{
memset(d,,sizeof(d));
memset(up,,sizeof(up));
memset(dn,,sizeof(dn));
memset(use,,sizeof(use));
memset(f,,sizeof(f));
cnt=;
} int main()
{
//freopen("aa.in","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&K);
clr();
int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
d[x-][y-]=d[y-][x-]=;
}
for(int k=;k<K;k++)
{
scanf("%d",&x);
up[k]=x-;
use[x-]=;
}
for(int i=;i<n;i++) if(!use[i]) dn[++cnt]=i;
for(int k=;k<=cnt;k++) f[k][]=;
for(int k=;k<=cnt;k++)
{
for(int s=;s<(<<K);s++) {f[k][s]=f[k-][s];}
for(int s=;s<(<<K);s++)
for(int i=;i<K;i++)
if(!((<<i)&s)&&d[up[i]][dn[k]])
for(int j=;j<K;j++)
if(i!=j&&!((<<j)&s)&&d[dn[k]][up[j]])
f[k][s|(<<i)|(<<j)] = max(f[k][s|(<<i)|(<<j)],f[k-][s]+);
}
int ans=;
for(int s=;s<(<<K);s++)
ans=max(ans,f[cnt][s]);
printf("%d\n",ans);
}
return ;
}
最新文章
- JavaScript------获取url地址中的参数
- C#改善程序的50种方法
- Linux Swap分区设定
- Redirect url 路径简单介绍
- VPS -Digital Ocean -初试以及VPN的搭建
- Laravel-5.1 ---- 将mews captcha整合到项目中!
- mybatis异常:Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}问题分析及解决
- AngularJS &#39;Controller As&#39;用法
- mac 安装PIL
- Exchange之三合一部署
- Android学习之Intent传递数据
- 使用Pechkin将HTML网页转换为PDF
- React之组件通信
- R语言进行机器学习方法及实例(一)
- 采购,接收数据收集SQL汇总(从订单->;接收->;INVOICE所有数据关联SQL)
- Docker 新手入门
- Java中的常用集合类型总结
- I: Carryon的字符串排序(字典树/map映射)
- VB脚本错误,系统找不到制定的文件 。代码:80070002
- UNIX高级环境编程(16)文件系统 <; 雨后 >;