/*
状态转移方程:dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]);
*/
#include<stdio.h>
#include<string.h>
#define N 16
int ma[N][N];
int num[N];
char s[150];
int lower[15];//储存二级制
int dp[N][1<<N];//储存最优状态
int now[1<<N],cu;//储存合法的状态
int sum[N][1<<N];//储存第i行第j个状态的总的权值和
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,i,j,k,maxx;
lower[0]=1;
for(i=1; i<=15; i++)
lower[i]=lower[i-1]*2;
while(gets(s))
{
k=0;
j=0;
n=0;
for(i=0; s[i]; i++)
{
if(j&&s[i]==' ')
{
ma[1][++n]=k;
j=0;
k=0;
}
if(s[i]>='0'&&s[i]<='9')
{
k=k*10+s[i]-'0';
j=1;
}
}
if(j)
ma[1][++n]=k;
for(i=2; i<=n; i++)
for(j=1; j<=n; j++)
scanf("%d",&ma[i][j]);
cu=0;
for(i=0; i<(1<<n); i++)//储存合法的状态
{
if(i<<1&i)continue;
now[++cu]=i;
}
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
for(i=1; i<=n; i++)
for(j=1; j<=cu; j++)
for(k=0; k<n; k++)//因为在二进制中1代表的就是lower[0],如果k从1开始的话,lower[1]=2,就缺少了1的情况
if(lower[k]&now[j])sum[i][j]+=ma[i][k+1];//lower[k]才是有效地
for(i=1; i<=cu; i++)//初始化第一行
dp[1][i]=sum[1][i];
for(i=2; i<=n; i++)
for(j=1; j<=cu; j++)
for(k=1; k<=cu; k++)
{
if(now[j]&now[k])continue;
if(now[j]&(now[k]<<1))continue;//如果和对角线和上面都没有相邻就符合
if(now[j]&(now[k]>>1))continue;
dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]);
}
maxx=-1;
for(i=1; i<=cu; i++)//求出所有状态的最大值
if(maxx<dp[n][i])
maxx=dp[n][i];
printf("%d\n",maxx);
gets(s);
gets(s);
}
return 0;
}

hdu 2167 状态压缩dp的更多相关文章

  1. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  2. HDU 3341 状态压缩DP+AC自动机

    题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...

  3. hdu 2167(状态压缩基础题)

    题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...

  4. hdu 4284 状态压缩dp

    题意: 有N 个点的无向图,要去其中 h个地点做事,做事需要先办理护照,之后可以挣一定数量的钱,知道了一开始有的总钱数,和 一些城市之间           道路的花费,问可不可以在 指定的 h 个城 ...

  5. HDU 4856 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...

  6. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  7. 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP

    Sitting in Line Problem Description   度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...

  8. HDU 5067 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目大意:蓝翔挖掘机挖石子.把地图上所有石子都运回起点,问最少耗时. 解题思路: 首先得YY出 ...

  9. hdu 4539(状态压缩dp)

    题意:曼哈顿距离是指:|x1-x2|+|y1-y2|,只要知道这个概念题意就懂了. 分析:这道题与前面做的几道题有所不同,因为当前行不仅与前一行有关,而且与前两行有关,所以我们开数组的时候还要记录前两 ...

随机推荐

  1. Head Html Css 第二版笔记

    一. 引用 <blockquote>ago aog aogag </blockquote> 则是引用一大段文字并独立显示 二. <a> 创建目的地 <h2&g ...

  2. Python之列表生成式、生成器

    列表生成式 ——可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁: >>> [x * x for x in range(1, 11)] [1, 4, ...

  3. Spring boot 分环境部署

    一.如果配置文件为:application.properties时 1.application.properties用于填些公共文件 以下为不同环境的配置文件需要单独配置 application-de ...

  4. 二分搜索 HDOJ 2675 Equation Again

    题目传送门 /* 二分搜索:式子两边取对数,将x提出来,那么另一边就是一个常数了,函数是:lnx/x.二分搜索x,注意要两次 */ #include <cstdio> #include & ...

  5. 转 linux shell自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  6. Hadoop的数据采集框架

    问题导读: Hadoop数据采集框架都有哪些? Hadoop数据采集框架异同及适用场景? Hadoop提供了一个高度容错的分布式存储系统,帮助我们实现集中式的数据分析和数据共享.在日常应用中我们比如要 ...

  7. 常用的几个Dos命令-持续更新中

    1.服务相关 (1).查看服务 C:\Windows\system32>net start 已经启动以下 Windows 服务: (2).启动服务 C:\Windows\system32> ...

  8. 北工大2017校赛 1101:要打车的FanZzz

    题目链接: http://bjutacm.openjudge.cn/lianxi/1101/ 思路: 二分 + 二分图最大匹配. 开始的时候我想直接用最小费用流模型,后来发现这样是错误的.因为这道题实 ...

  9. Rxjava1升级Rxjava2踩坑一记

    Rxjava1升级Rxjava2坑 共存问题 通常情况下,如果我们希望在一个模块中既想使用rxjava1又想使用rxjava2,这个时候在运行的时候会出现一下报错: ... APK META/-INF ...

  10. springboot运行模式

    1.springboot项目常见的运行方式:  2.说明: idea:在开发环境中跑项目,也就是我们在编码过程中的用的做多的方式 jar.war:线上.服务器上执行jar.war包的方式 maven插 ...