状压dp 方格取数(1)
来源:互联网 发布:单片机c语言讲解 编辑:程序博客网 时间:2024/06/14 10:01
题目地址
题目大意:给你一个n*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
思路:zh这个题是好久以前看过题解,当时感觉挺困难的,就没做,这两天才做的,对于现在来说也不算是难题了,不过是每个地方都加了数,加个函数算一下就可以了,很标准的状压dp题了
代码:
#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<queue>#include<stack>#include<map>#define inf 0x3f3f3f3fusing namespace std;int N,M,dp[17720][25],a[25][25],num[17720];long long max(long long aa,long long bb){ if(aa>bb) return aa; return bb;}long long AA(int x,int i){ long long sum=0,k=1; while(i) { if(i&1) sum+=a[x][N-k]; k++; i/=2; } return sum;}int main(){ int i,j,k,l,s,c,ans; while(~scanf("%d",&N)) { k=0; ans=0; memset(dp,0,sizeof(dp)); for(i=0;i<N;i++) for(j=0;j<N;j++) scanf("%d",&a[i][j]); l=(1<<N); for(i=0;i<l;i++) { if(i&(i<<1))continue; num[++k]=i; } for(i=1;i<=k;i++) { dp[i][0]=AA(0,num[i]); } for(i=1;i<N;i++) for(j=1;j<=k;j++) for(c=1;c<=k;c++) { if(num[c]&num[j]) continue; dp[j][i]=max(dp[c][i-1]+AA(i,num[j]),dp[j][i]); //cout<<j<<" "<<i<<" "<<c<<" "<<dp[j][i]<<endl; } for(i=1;i<=k;i++) { ans=max(ans,dp[i][N-1]); } printf("%d\n",ans); }}
阅读全文
0 0
- 状压dp 方格取数(1)
- [DP]方格取数
- HDU 1565 方格取数(1)(状压dp)
- HDU 1565 方格取数(1)(状压DP)
- hdu 1565 方格取数(1) 状压DP
- HDU1565—方格取数(1)——状压DP
- hdoj 1565 方格取数(1) 【状压DP 基础题目】
- hdu 1565 方格取数(1)【状压dp】
- HDU - 1565 方格取数(1) 状压DP
- HDU 1565 方格取数(1) (状压dp)
- HDU 1565 方格取数(1) (状压DP)
- [HDU 1565]方格取数(1):状压DP
- HDU1565 方格取数(1) —— 状压DP
- hdu1565 方格取数(1)(状压dp)
- HDU 1565 方格取数(1) (状压DP)
- hrbust 1843 方格取数【状压dp】
- HDU - 1565 方格取数(1) (DP)
- 方格取数(1) (状态dp)
- Python之break和continue
- vim
- 【1701H1】【穆晨】【171203】连续第五十四天总结
- Linux作业二
- 数组的冒泡排序
- 状压dp 方格取数(1)
- SpringMVC拦截器
- transform实现元素的移动、缩放、旋转、变形
- 邻接表存图
- HDOJ 2555 人人都能参加第30届校田径运动会了
- 折线分割平面 HDU
- 【项目实战】---SQLServer中case when的简单用法
- 深度学习CNN-基本概念
- MVC开发模式