在本题中,n&lt;=16n&lt;=16n<=16, 不难想到可以将所选数字的编号进行状态压缩。

定义状态 dp[S][j]dp[S][j]dp[S][j],其中 SSS 代表当前所选出的所有数字编号,jjj 代表当前位置考虑的数字编号。

如果状态合法,可以转移状态 dp[S][j]=max(dp[S][j],dp[Sdp[S][j]=max(dp[S][j], dp[Sdp[S][j]=max(dp[S][j],dp[S^j][k]+val[j]∗val[k])j][k] +val[j]*val[k])j][k]+val[j]∗val[k])

不合法就直接跳过

本题比较简单,只要细节上不出错应该是一道送分题。

#include<cstdio>//hdu 5691
#include<cstring>
#include<algorithm>
using namespace std;
const int N=16;
const long long INF=-122222222222;
long long dp[1<<N][N+2];
int pos[N+2],val[N+2],idx[N+2];
int n;
void init()
{
memset(idx,0,sizeof(idx));
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&val[i],&pos[i]);
pos[i]=(pos[i]==-1)?-1:pos[i]+1;
if(pos[i]>0)idx[pos[i]]=i;
}
}
int check(int i,int j)
{
int cnt=0;
if((i&(1<<(j-1)))==0)return 0; //当前考虑的数在 i 中不存在。
for(int k=0;(1<<k)<=i;++k)if(i&(1<<k))++cnt;
if(pos[j]!=-1&&cnt!=pos[j])return 0;
if(idx[cnt]&&idx[cnt]!=j)return 0;
return 1;
}
int times(int s){
int cnt=0;
for(int k=0;(1<<k)<=s;++k)if(s&(1<<k))++cnt;
return cnt;
}
int main(){
int T;scanf("%d",&T);
for(int cas=1;cas<=T;++cas)
{
init();
for(int S=1;S<(1<<n);++S)
for(int j=1;j<=n;++j)
{
dp[S][j]=INF;
int mx=(S^(1<<(j-1))); if(check(S,j)==0)continue;
if(mx==0){dp[S][j]=val[j];continue;}
int cnt=times(mx);
for(int k=1;k<=n;++k)
{
if(k==j)continue;
if(cnt==1)
{
long long a=0;
if(check(mx,k))dp[S][j]=max(dp[S][j],a+val[k]*val[j]);
}
else dp[S][j]=max(dp[S][j],dp[mx][k]+val[k]*val[j]);
}
}
long long ans=INF;
for(int i=1;i<=n;++i)
ans=max(ans,dp[(1<<n)-1][i]);
printf("Case #%d:\n",cas);
printf("%lld\n",ans);
}
return 0;
}

hdu 5691 Sitting in line 状压动归的更多相关文章

  1. hdu 5691 Sitting in Line 状压dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 题解: 和tsp用的状压差不多,就是固定了一些访问顺序. dp[i][j]表示前cnt个点中布 ...

  2. HDU 5691 ——Sitting in Line——————【状压动规】

    Sitting in Line Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Other ...

  3. hdu 5691 Sitting in Line

    传送门 Sitting in Line Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/O ...

  4. BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归

    Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...

  5. HDU 3605 Escape 最大流+状压

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 2000/1000 MS (Java/Others)    ...

  6. HDU 5025 (BFS+记忆化状压搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5025 题目大意: 迷宫中孙悟空救唐僧,可以走回头路.必须收集完钥匙,且必须按顺序收集.迷宫中还有蛇, ...

  7. HDU 6149 Valley Numer II 状压DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...

  8. HDU 1074 Doing Homework【状压DP】

    Doing Homework Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he ...

  9. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

随机推荐

  1. Webpack 学习记录之概念

    1 什么是webpack webpack是一个模块打包器,可以递归的构建一个依赖关系图,其中包含每个程序需要的每个模块,然后将所有模块打包成一个或多个bundle.他和其他的工具最大的不同在于他支持c ...

  2. linux基础正则

    1.^word #匹配word开头的内容,vi/vim编辑器里^代表一行的开头. 2.word$ #匹配以word结尾的内容,vi/vim编辑器里$代表一行的结尾. 3.^$ #表示空行 4.. #代 ...

  3. 01.Python基础-3.集合容器

    1 列表list 1.1 列表介绍 Python内置的一种数据类型是列表:list. 有序的集合,可随时添加和删除其中的元素. 每个元素都分配一个数字 --它的位置,或索引.0,1,2,3-- 可存放 ...

  4. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  5. Myeclipse学习总结(6)——MyEclipse断点调试

    当程序写好之后,如何调试呢? 我们在MyEclipse中jav添加断点,运行debug as-->open debug Dialog,然后在对话框中选类后--> Run在debug视图下. ...

  6. centos solr 集群搭建

    一.什么是 SolrCloud SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时 ...

  7. PatentTips - Optimizing power usage by factoring processor architectural events to PMU

    BACKGROUND Processor power consumption has become a major issue in recent years. The current trend o ...

  8. C专家编程之为什么C语言把数组形參当做指针:数组/指针实參

    #include<stdio.h> void print_array_test(char ca[]) { printf("ca : %s\n",ca); printf( ...

  9. POJ 2134

    这道题屡交屡错,什么鬼!!!!明明就是一个简单的BFS,啊~!!!!!~~~~~~就是一个简单的BFS!!!!~~~~~什么鬼!!!!!!! FUCK,在discuss里也很多人吐槽,怪不得那么少人做 ...

  10. 关于心理的二十五种倾向(查理&#183;芒格)-2

    5)避免不一致倾向避免不一致倾向实际上就是人天生就害怕改变.相同是由于人类大脑的生理机制决定的.由于这样的倾向能够带来节省运算空间和能量的优点.这样的抗改变模式的形成,可能的原因例如以下:A) 迅速作 ...