典型的状态压缩DP问题。第i行的取法只受到第i-1行的影响。首先每一行的取法要相容(不能有两个相邻),然后相邻行之间也要相容。将每一个格子看做两种状态,1表示取,0表示不取。这样每一行就是一个01串,恰好可以看做是一个二进制数,那么该二进制数对应的十进制整数可以唯一的表示为当前第 i 行的状态。定义用dp[i][j]表示前 i 行状态为j 时最大和。其中状态 j对应的整数为stu[j],数组stu[]收录的是所有合法的状态,所谓合法状态是:若一个整数的二进制中没有任意两个1相邻,那么该整数就是合法的状态。判定方法:若 x&(x<<1)==0,则x是合法的状态。状态转移方程如下:

dp[i][j]=max{dp[i-1][w]}+value[i][j] (w&j==0) ;

方程含义:j是第i行状态,w是第i-1行的状态,value[i][j]是第i行状态为j时第i行取法的和。从w状态转移到j状态需要满足w&j==0(他们是相容的)。计算时候需要枚举第i行所有状态w。代码如下:

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
using namespace std;
#define MAX_SIZE 17712 //当n=20时可以计算得到最多有11710中状态
int stu[MAX_SIZE], Value[MAX_SIZE]; //stu表示总的状态数,MAX_SIZE表示对应状态的值
int a[][], dp[][MAX_SIZE];
int initialization(int n);
int stuValue(int i, int j);
int main(){
int i, j, k, m, n, lmax, maxSum;
while (~scanf("%d", &n)){
m = initialization(n);
for (i = ; i <= n; i++)
for (j = ; j <= n; j++)
scanf("%d", &a[i][j]);
memset(dp[], , sizeof(dp[]));
maxSum = ;
for (i = ; i <= n; i++)
for (j = ; j < m; j++){
lmax = ;
for (k = ; k < m; k++){
if (!(stu[j] & stu[k]) && lmax < dp[i - ][k]) //如果上下相容,且当前的值大于原来最大值
lmax = dp[i - ][k];
}
dp[i][j] = lmax + stuValue(i, j); //计算状态dp[i][j]
if (maxSum < dp[i][j])
maxSum = dp[i][j];
}
printf("%d\n", maxSum);
}
return ;
}
int initialization(int n){
int ant = ;
for (int i = ; i < ( << n); i++){
if (!(i&(i << )))
stu[ant++] = i;
}
return ant;
}
int stuValue(int i, int j){ //第i行,状态为stu[j]时候第i行的值
int k = stu[j], t = , sum = ;
while (k>){
if (k & )
sum += a[i][t];
t++;
k = k >> ;
}
return sum;
}

HDU1565方格取数的更多相关文章

  1. HDU1565 方格取数(1) —— 状压DP or 插头DP(轮廓线更新) or 二分图点带权最大独立集(最小割最大流)

    题目链接:https://vjudge.net/problem/HDU-1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory L ...

  2. HDU-1565 方格取数(1)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Me ...

  3. HDU1565 方格取数 &&uva 11270 轮廓线DP

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. Hdu-1565 方格取数(1) (状态压缩dp入门题

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. HDU1565 方格取数(1)

    Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数 ...

  6. HDU1565 方格取数1(构图+网络流最大独立集合)

    题目大意:给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 解题思路:最大点 ...

  7. HDU1565 方格取数(1)(状态压缩dp)

    题目链接. 分析: 说这题是状态压缩dp,其实不是,怎么说呢,题目数据太水了,所以就过了.手动输入n=20的情况,超时.正解是网络流,不太会. A这题时有个细节错了,是dp[i][j]还是dp[i][ ...

  8. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

  9. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

随机推荐

  1. Effictive C++ 学习记录

    这是前段时间看的书,整理到这里吧,以后查看也方便. 这些条款需要反复查看. 条款01:视C++为一个语言联邦 条款02:尽量用const.enum.inline替换#define 条款03:尽可能的使 ...

  2. python - 接口自动化测试 - RunTest - 测试用例加载执行/测试报告生成

    # -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: run_test.py @ide: PyCharm Com ...

  3. live 555 freebsd 或centos 7.4 实现代理视频直播服务

    live 555   freebsd 或centos 7.4 实现代理视频直播服务 the live555 media server    在线直播服务器 关于此服务器 此服务是一个无安全的rtsp服 ...

  4. [译]如何检查python中的值是否为nan?

    float('nan')是Nan不是一个数字,我该如何判断一个值为nan,有什么简单的方法么? 使用math.isnan()来进行判断 >>> import math >> ...

  5. Corrupt block relative dba: 0x04c20df1

    alert日志报以下提示: Corrupt block relative dba: , block ) Fractured block found during backing up datafile ...

  6. Zabbix整合MegaCLI实现物理硬盘的自动发现和监控

    MegaCLI是LSI提供的用户空间管理RAID卡(LSI芯片)工具,适用于大多数的Dell服务器. MegaCLI介绍: http://zh.community.dell.com/techcente ...

  7. 查看端口被占用并结束进程 mac

  8. tmux使用备忘

    创建新的session tmux 查看已有session tmux ls 进入tmux后 默认快捷键前缀为Ctrl+b,可以通过配置文件来修改 从session中断开 C-b d 给session改名 ...

  9. html table 表格

    前面的话 在CSS出现之前,table元素常常用来布局.这种做法在HTML4之后不再推荐使用.而现在有些矫枉过正,使用table展示数据都可能会被说不规范.本文将详细介绍HTML表格table tab ...

  10. 读扇区错误:0柱面0磁头1扇区(硬盘问题,蓝屏等 0x0000007B)

    原文发布时间为:2010-05-25 -- 来源于本人的百度文章 [由搬家工具导入] 读扇区错误:0柱面0磁头1扇区(硬盘问题,蓝屏等 0x0000007B) DISKGEN能找到,那就没什么大问题的 ...