%hz大佬。。这道题的状态压缩简直匪夷所思(其实是我孤陋寡闻,而且我以前的博客竟然写了这题。。水啊)

嗯这题可以发现,我们可以用一个二进制表示一行的状态,1表示选0反之,可以发现行与行之间可选的范围是确定的,比如说:
100
这样的状态适用于每一行,推广一下:
100
001
是适用于任何两行之间的。所以我们可以先将所有成立的状态求出来,要求就是左移一位和右移一位和原状态&运算为0,这样保证每个1左右都没有1。然后枚举行、状态,可以继承的状态,继承可以继承的状态的最大值,然后加上这一行的得到的值即可。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,mp[][];
int ol,o[],f[][];
bool bj(int x,int y)
{
return ((x&y)==)?true:false;
}
int hehe(int k,int x)
{
int tp=,ans=;
while(x!=)
{
tp++;
if(x%==)ans+=mp[k][tp];
x/=;if(tp==n)break;
}
return ans;
}
int main()
{
scanf("%d",&n);
int t=;for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
scanf("%d",&mp[i][j]);
t=t*;
}
o[++ol]=;f[][]=;
for(int i=;i<t;i++)
if(bj(i,i/)==true&&bj(i,i*)==true)
{
o[++ol]=i;
f[][i]=hehe(,i);
} for(int k=;k<=n;k++)
{
for(int i=;i<=ol;i++)
{
for(int j=;j<=ol;j++)
{
if(bj(o[i],o[j])==true&&bj(o[i],o[j]/)==true&&bj(o[i],o[j]*)==true)
{
f[k][o[i]]=max(f[k][o[i]],f[k-][o[j]]);
}
}
f[k][o[i]]+=hehe(k,o[i]);
}
}
int ans=;
for(int i=;i<=ol;i++)
if(f[n][o[i]]>ans)ans=f[n][o[i]];
printf("%d\n",ans);
return ;
}

最新文章

  1. 百度sdk定位不成功,关闭定位
  2. HttpWebRequest.GetResponse 方法
  3. js根据生日计算出年龄
  4. Java基础(37):Java中日期的显示与格式定值----Date与SimpleDateFormat的试用
  5. mybatis系列-07-输出映射
  6. iOS学习之基本概念
  7. Nginx源码研究八:nginx监听socket实现流程
  8. Unity 两张背景的切换平移
  9. 在hive中直接对timestamp类型取max报错
  10. C++函数调用的反汇编过程及Thunk应用
  11. Maven setting.xml 文件剖析
  12. 我应该跟libuv说声对不起,我错怪了libuv(转)
  13. mui框架中dialog框的实现
  14. css之幽灵空白节点
  15. JavaFX 记录刚刚接触JavaFX遇到的问题
  16. 对国内AR产业的预言
  17. go的包下载失败解决方案
  18. Appium+java 获取元素状态
  19. SQL Prompt 快捷键
  20. Ubuntu 16.04安装Pycharm2017.1.1

热门文章

  1. Oracle常用内置数据表查询
  2. ms sql server 大批量导入
  3. php-fpm.conf
  4. 修改K/3 Cloud管理中心端口
  5. android修改系统时系统黑屏时不进入休眠状态
  6. hdu 4049 Tourism Planning [ 状压dp ]
  7. OC温习一:基本数据类型
  8. WordPress 权限方案
  9. [Bzoj4570][Scoi2016]妖怪(右上凸包)
  10. TUN/TAP区别