POJ - 1185 敌兵炮阵
中文题。。
思路:这题可把我恶心坏了,我刚开始的思路其实是正确的。。。
首先我想开个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 敌兵炮阵的更多相关文章
- HDU 1166 敌兵布阵 (树状数组)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1166 敌兵布阵(分块)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- hdu acm 1166 敌兵布阵 (线段树)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵
B - 敌兵布阵 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- HDU 1166 敌兵布阵(线段树模板题)
题目链接: 传送门 敌兵布阵 Time Limit: 2000MS Memory Limit: 32768 K Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头 ...
- ACM: 敌兵布阵 解题报告 -线段树
敌兵布阵 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description Li ...
- hdu 敌兵布阵(线段树之单点更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu 1166 敌兵布阵--BIT
BIT模版题,学完直接刷毫无压力,水的不要不要的 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
随机推荐
- quartz定时任务-job
1,首先添加对quartz组建的引用 quartz-2.2.3.jar,slf4j-api-1.7.7.jar https://files.cnblogs.com/files/renjing/quar ...
- GC.SuppressFinalize()的正确用法
SuppressFinalize函数是: 该方法在对象头中设置一个位,系统在调用终结器时将检查这个位.obj 参数应为此方法的调用方. 实现 IDisposable 接口的对象可以从 IDisposa ...
- 支付宝app支付流程
- 第5月第6天 NSOperation isConcurrent category同名覆盖
1. @implementation AFURLConnectionOperation ... - (BOOL)isConcurrent { return YES; } NSOperation调用st ...
- 2018-2019-2 网络对抗技术 20165320 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165320 Exp4 恶意代码分析 一.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行 分析一个恶意软件,就分析Exp2或Exp3中生成后门软 ...
- oracle查询所有的表明
如果是用该用户登录使用以下语句: SELECT * FROM USER_TABLES; 如果是用其他用户: SELECT * FROM ALL_TABLES WHERE OWNER='USER_NAM ...
- WPF开发中的多线程的问题
今天帮助同事做了一个WPF版的多线程demo,分享给大家. 要实现的问题就是非主线程thread1 去后台不停的取新数据,当有新数据的时候就会展示到前台. 我给他做的demo实现一个按秒的计数器,随着 ...
- MIPI协议学习总结(一)
一.MIPI 简介: MIPI(移动行业处理器接口)是Mobile Industry Processor Interface的缩写.MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准. 已经完 ...
- centos6.5 nfs实时共享
一.什么时NFS NFS(Network File System)——网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,NF ...
- zabbix监控短信息接口是否正常
1.创建Web scenarios 2.创建zabbix触发器name:short_message send status is not 100 Expression:{u04zbx01.yaya.c ...