【题目链接】

点击打开链接

【算法】

状压DP

先搜出一行符合的情况,然后,f[i][j]表示第i行,状态为j,能够取得的最大值,DP即可

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 16
const int MAXS = ; int i,j,k,n,tot,ans,val,MASK;
int a[MAXN][MAXN],f[MAXN][MAXS],ST[MAXS];
char c; int main()
{ while (scanf("%d",&a[][]) != EOF)
{
n = ;
tot = ans = ;
memset(f,,sizeof(f));
scanf("%c",&c);
while (c != '\n')
{
scanf("%d",&a[][++n]);
scanf("%c",&c);
}
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
scanf("%d",&a[i][j]);
}
}
MASK = ( << n) - ;
for (i = ; i <= MASK; i++)
{
if (i & (i << )) continue;
ST[++tot] = i;
for (j = ; j < n; j++)
{
if (i & ( << j))
f[][tot] += a[][j+];
}
}
for (i = ; i <= n; i++)
{
for (j = ; j <= tot; j++)
{
val = ;
for (k = ; k < n; k++)
{
if (ST[j] & ( << k))
val += a[i][k+];
}
for (k = ; k <= tot; k++)
{
if (ST[j] & ST[k]) continue;
if (ST[j] & (ST[k] >> )) continue;
if (ST[j] & (ST[k] << )) continue;
f[i][j] = max(f[i][j],f[i-][k] + val);
}
}
}
for (i = ; i <= n; i++)
{
for (j = ; j <= tot; j++)
{
ans = max(ans,f[i][j]);
}
}
printf("%d\n",ans);
scanf("%c",&c);
} return ;
}

最新文章

  1. Angular 2.0 的设计方法和原则
  2. openstack-kilo--issue(九) heat stacks topology中图形无法正常显示
  3. 奇怪吸引子---Rucklidge
  4. solr性能调优
  5. TST fall detection database
  6. cocos2d-x3.0环境搭建(基于win7以及mac)
  7. CIPAddressCtrl控件
  8. struts2 使用jsonplugin
  9. (转)Java 的swing.GroupLayout布局管理器的使用方法和实例
  10. android自定义View---生成虚线的View
  11. html的常用基础应用
  12. git初试
  13. JavaScript数据类型检测 数组(Array)检测方式
  14. 将选中的物体写入XML文件
  15. 以CENTOS6.8系统为例部署ORACLE11g RAC和DNS配置
  16. 帝国cms判断某一字段是否为空
  17. Mongodb集群与分片 1
  18. python笔记-6(import导入、time/datetime/random/os/sys模块)
  19. jqgrid单元格合并
  20. android_orm框架之greenDAO(一)

热门文章

  1. Linux 磁盘测速
  2. leetcode之twosum
  3. poj 3678 XOR和OR和AND(简单2-sat问题)
  4. .NET 调用java webservice保存datetime类型数据为空的解决办法
  5. Javascript 检查字符串是否是数字的几种方法
  6. Mysqli的常用函数
  7. HDU——1054 Strategic Game
  8. Permutations(排列问题,DFS回溯)
  9. HDU 2050 【dp】【简单数学】
  10. POJ 2337 【字典序】【欧拉回路】