【HDU 2167】 Pebbles
2024-09-04 23:35:32
【题目链接】
【算法】
状压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 ;
}
最新文章
- Angular 2.0 的设计方法和原则
- openstack-kilo--issue(九) heat stacks topology中图形无法正常显示
- 奇怪吸引子---Rucklidge
- solr性能调优
- TST fall detection database
- cocos2d-x3.0环境搭建(基于win7以及mac)
- CIPAddressCtrl控件
- struts2 使用jsonplugin
- (转)Java 的swing.GroupLayout布局管理器的使用方法和实例
- android自定义View---生成虚线的View
- html的常用基础应用
- git初试
- JavaScript数据类型检测 数组(Array)检测方式
- 将选中的物体写入XML文件
- 以CENTOS6.8系统为例部署ORACLE11g RAC和DNS配置
- 帝国cms判断某一字段是否为空
- Mongodb集群与分片 1
- python笔记-6(import导入、time/datetime/random/os/sys模块)
- jqgrid单元格合并
- android_orm框架之greenDAO(一)