题目http://acm.hdu.edu.cn/showproblem.php?pid=5691

状态DP,dp[i][j],i 表示的是一种状态,这个状态指的是当前这个数取或不取,j表示的是以第j个数结尾,

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; typedef long long ll;
ll dp[<<][]; int num[],dis[],vis[];
ll max(ll x,ll y) {return x>y?x:y;}
const ll INF=1e18; int main()
{
int t,n,pos=;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
memset(vis,-,sizeof(vis));
for(int i=;i<(<<n);i++)
for(int j=;j<n;j++)
dp[i][j] = -INF;
for (int i= ; i<n ; i++) {
scanf("%d%d",&num[i],&dis[i]);
if (dis[i]!=-)
vis[dis[i]]=i;
}
if (vis[]!=-) dp[(<<vis[])][vis[]]=;// 0这个位子被占用了
else{
for (int i= ; i<n ; i++) // 没有特定位置
if (dis[i]==-) dp[(<<i)][i]=; //
}
int cas=(<<n)-;
for (int i= ; i<=cas ; i++){
int ans=;
for (int j= ; j<n ; j++)
if (i&(<<j))
ans++;
if (vis[ans]!=-)
{
ans=vis[ans];
for (int j= ; j<n ; j++)
if ((i&(<<j))&&j!=ans)
dp[i|(<<ans)][ans]=max(dp[i|(<<ans)][ans],dp[i][j]+num[j]*num[ans]);
}
else
{
for (int j= ; j<n ; j++){
if (i&(<<j)){
for (int k= ; k<n ; k++){
if (!(i&(<<k))){
dp[i|(<<k)][k]=max(dp[i|(<<k)][k],dp[i][j]+num[k]*num[j]);
}
}
}
}
}
}
printf("Case #%d:\n",++pos);
ll maxn=-INF;
for (int i= ; i<n ; i++)
maxn=max(maxn,dp[cas][i]);
printf("%I64d\n",maxn);
}
return ;
}

hdu 5691(状压DP) Sitting in Line的更多相关文章

  1. HDU 4778 状压DP

    一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...

  2. HDU 3001 状压DP

    有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路  成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...

  3. Doing Homework HDU - 1074 (状压dp)

    Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...

  4. hdu 2809(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...

  5. hdu 2167(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...

  6. Engineer Assignment HDU - 6006 状压dp

    http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...

  7. hdu 3254 (状压DP) Corn Fields

    poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...

  8. HDU 5823 (状压dp)

    Problem color II 题目大意 定义一个无向图的价值为给每个节点染色使得每条边连接的两个节点颜色不同的最少颜色数. 对于给定的一张由n个点组成的无向图,求该图的2^n-1张非空子图的价值. ...

  9. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

随机推荐

  1. 远程批量查看windosws操作系统3389端口的开放情况

    本文只提供思想.具体可以根椐情况拓展. 前提是需要配置远程主机的SNMP协议.主要是共同体哟. 脚本使用: 1.拷贝check_tcp到脚本执行的主机中或在此主机中安装nagios; 2.保持list ...

  2. 吴裕雄 python 机器学习-KNN算法(1)

    import numpy as np import operator as op from os import listdir def classify0(inX, dataSet, labels, ...

  3. 吴裕雄 29-MySQL 处理重复数据

    MySQL 处理重复数据有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据.本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数 ...

  4. java中map接口hashMap以及Enty之间的用法和关系

    java中map接口hashMap以及Enty之间的转换 首先说的是map接口: Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value ...

  5. 笔记-Python中逗号的作用

    1.用,去掉额外的换行符

  6. pta_l1-6(连续因子)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805138600869888 题意:给定n,求n的最长的连续子因 ...

  7. 第三章 列表(d)选择排序

  8. PHP调用外部程序的方法

    很多情况下需要php调用其他程序如shell命令.shell脚本.可执行程序等等,此时需要使用到诸如exec/system/popen/proc_open等函数,每种函数有各自适合使用的场景以及需要注 ...

  9. TZOJ 4712 Double Shortest Paths(最小费用最大流)

    描述 Alice and Bob are walking in an ancient maze with a lot of caves and one-way passages connecting ...

  10. 【转】python中的字符数字之间的转换函数

    int(x [,base ])         将x转换为一个整数     long(x [,base ])        将x转换为一个长整数     float(x )               ...