POJ - 3254

中文题。。

思路:这题可把我恶心坏了,我刚开始的思路其实是正确的。。。

首先我想开个dp[i][s1][s2]保存到 i行 为止当前行状态为s1,上一行状态为s2 的最大个数,然后我先把满足行内条件的

状态存起来,空间用滚动数组优化,但是我在写转移方程的时候发现复杂度太大。。。。 其实复杂度是够的,因为一行里面

满足行内条件的最多有60个合法状态,哈希一下就好啦,都不用滚动数组。。。

然后我又开脑洞去搞三进制的状态压缩,写到最后发现复杂度又不对,才发现原来的方法是正确的。。。。

 #include<cstdio>
#include<vector>
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define read(x) scanf("%d",&x)
#define sread(x) scanf("%s",x)
#define dread(x) scanf("%lf",&x)
#define lread(x) scanf("%lld",&x)
using namespace std; typedef long long ll;
const int inf=0x3f3f3f3f;
const int INF=0x3f3f3f3f3f3f3f3f;
const int N=;
const int M=;
const int mod=1e8; int n,m,dp[][][],f[N];
char s[];
vector<int> v,num;
bool check(int x)
{
int cnt=,cur=x;
while(x)
{
int now=x%;
if(cnt< && now)
return false;
if(now) cnt=;
else cnt++;
x/=;
}
return true;
}
int cal(int x)
{
int ans=;
while(x)
x-=x&-x,ans++;
return ans;
}
int main()
{
read(n); read(m);
for(int i=;i<n;i++)
{
scanf("%s",s);
for(int j=;j<m;j++)
f[i]*=,f[i]+=s[j]=='P'? :;
}
int up=<<m;
for(int i=;i<up;i++)
{
if(check(i))
{
v.push_back(i);
num.push_back(cal(i));
}
}
int sz=v.size();
for(int i=;i<sz;i++)
{
int s1=v[i];
if((s1|f[])!=f[])
continue;
for(int j=;j<sz;j++)
{
int s2=v[j];
if((s2|f[])!=f[] || (s1&s2))
continue;
dp[][i][j]=num[i]+num[j];
}
}
for(int i=;i<n;i++)
{
for(int j=;j<sz;j++)
{
for(int k=;k<sz;k++)
{
for(int u=;u<sz;u++)
{
int s1=v[j],s2=v[k],s3=v[u];
if((s1&s2) || (s1&s3) || (s1|f[i])!=f[i])
continue;
dp[i][k][j]=max(dp[i][k][j],dp[i-][u][k]+num[j]);
}
}
}
}
int ans=;
if(n!=)
{
for(int i=;i<sz;i++)
for(int j=;j<sz;j++)
ans=max(ans,dp[n-][i][j]);
}
else
{
for(int i=;i<sz;i++)
if((v[i]|f[])==f[])
ans=max(ans,num[i]);
}
printf("%d\n",ans);
}
/*
*/

POJ - 1185 敌兵炮阵的更多相关文章

  1. HDU 1166 敌兵布阵 (树状数组)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    ...

  2. HDU 1166 敌兵布阵(分块)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  4. hdu acm 1166 敌兵布阵 (线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. HDU 1166 敌兵布阵

    B - 敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  6. HDU 1166 敌兵布阵(线段树模板题)

    题目链接: 传送门 敌兵布阵 Time Limit: 2000MS     Memory Limit: 32768 K Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头 ...

  7. ACM: 敌兵布阵 解题报告 -线段树

    敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Li ...

  8. hdu 敌兵布阵(线段树之单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. hdu 1166 敌兵布阵--BIT

    BIT模版题,学完直接刷毫无压力,水的不要不要的 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

随机推荐

  1. 词典的实现(4)-使用Hash方式来实现词典

    1,实现思路 public class HashedDictionary<K, V> implements DictionaryInterface<K, V>, Seriali ...

  2. CSS cursor 属性改变鼠标的样式

    可能的值 值 描述 url 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标. default 默认光标(通常是一个箭头) auto 默 ...

  3. kubernetes 集群

    一.CentOS 7 基础环境准备 centos 默认服务目录 /usr/lib/systemd/system systemctl服务开机启动链接存贮目录: /etc/systemd/system/b ...

  4. 第18月第20天 tensorflow安装

    1. # Mac OS X $ sudo easy_install pip # Mac OS X, CPU only: $ sudo easy_install --upgrade six $ sudo ...

  5. windows钩子函数

    一 什么时候用到钩子?(when)Windows操作系统是建立在事件驱动的消息处理机制之上,系统各部分之间的沟通也都是通过消息的相互传递而实现的.通常情况下,应用程序只能处理当前进程的消息,如果需要对 ...

  6. XMLHttpRequest: 网络错误 0x2f78,…00002f78

    常在河边走,怎能不湿脚,在web前端开发的过程中总是遇到很多关于IE的故事. 一个get请求,传了一个json对象,包含一串参数,在IE上就出现了这个问题:XMLHttpRequest: 网络错误 0 ...

  7. VMware xp系统联网

    1.

  8. Linux内存管理--基本概念【转】

    转自:http://blog.csdn.net/myarrow/article/details/8624687 1. Linux物理内存三级架构 对于内存管理,Linux采用了与具体体系架构不相关的设 ...

  9. Innodb ,MyISAM

    1. InnoDB不支持FULLTEXT类型的索引. 2. InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算 ...

  10. 使用第三方工具Xtrabackup进行MySQL备份

    使用Xtrabackup进行MySQL备份: 一.安装 1.简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtr ...