_YPC @ 2018-10-29 15:41:01
这道题目我第一个点WA了,但是各位想想,这题目的第一个点就是样例,我怎么可能样例没过就提交啊……而且我自己也把这个这点下载下来测过了,Van♂全没有问题啊……
这个是数据:
Sample Input:
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output:
6
然后这个是代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=106,maxs=(1<<10)+6;
int f[2][maxs][maxs],n,tot[maxn],sta[maxn][maxs],m,ans;
inline void get_status(int x,int t){
for (int i=0;i<(1<<m);i++){
if ((i&t)||(i&(i<<1))||(i&(i<<2)))continue;
sta[x][++tot[x]]=i;
}
}
inline int get_one(int x){
int ret=0;
while (x)ret=ret+x%2,x>>=1;
return ret;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
getchar();
int t=0;
for (int j=1;j<=m;j++){
char ch=getchar();
if (ch=='P')t=(t<<1);else t=(t<<1)+1;
}
get_status(i,t);
}
sta[0][tot[0]=1]=0;
for (int i=1;i<=tot[1];i++)f[1][i][1]=get_one(sta[1][i]);
for (int i=2;i<=n;i++)
for (int j=1;j<=tot[i];j++)
for (int k=1;k<=tot[i-1];k++){
if (sta[i][j]&sta[i-1][k])continue;
for (int a=1;a<=tot[i-2];a++){
if ((sta[i][j]&sta[i-2][a])||(sta[i-1][k]&sta[i-2][a]))continue;
f[i&1][j][k]=max(f[i&1][j][k],f[(i-1)&1][k][a]+get_one(sta[i][j]));
}
}
for (int i=1;i<=n;i++)
for (int j=1;j<=tot[i];j++)
for (int k=1;k<=tot[i-1];k++)ans=max(ans,f[i&1][j][k]);
printf("%d\n",ans);
return 0;
}
这个点我在洛谷上测出来的是5,但是本地跑就是6……(各位可以把我的代码拷贝下来自己测一下qwq)
非常难受啊,求巨佬解答QAQ。
by 哔哩哔哩 @ 2018-10-29 15:43:39
日常膜YPC[1/1]get!
by _YPC @ 2018-10-29 15:44:00
@哔哩哔哩 QAQ
by fantianqi @ 2018-10-29 15:46:31
by shadowice1984 @ 2018-10-29 16:00:34
我太菜了看不懂您的代码QwQ
当你死活调不过去一道题的时候重构代码是最有效的调试工具
by Flandre_495 @ 2018-10-29 16:58:53
不要跟评测机较真了;
直接特判吧。。
by jeffqi @ 2018-10-29 17:00:21
@_YPC
#include<bits/stdc++.h>
using namespace std;
const int maxn=106,maxs=65;
int f[2][maxs][maxs],n,tot[maxn],sta[maxn][maxs],m,ans;
inline void get_status(int x,int t){
for (int i=0;i<(1<<m);i++){
if ((i&t)||(i&(i<<1))||(i&(i<<2)))continue;
sta[x][++tot[x]]=i;
}
}
inline int get_one(int x){
int ret=0;
while (x)ret=ret+x%2,x>>=1;
return ret;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
int t=0;
for (int j=1;j<=m;j++){
char ch; cin>>ch;
if (ch=='P')t=(t<<1);else t=(t<<1)+1;
}
get_status(i,t);
}
for (int i=1;i<=tot[1];i++)f[1][i][1]=get_one(sta[1][i]);
for (int i=1;i<=tot[2];i++)
for (int j=1;j<=tot[1];j++){
if(sta[2][i]&sta[1][j])continue;
f[0][i][j]=max(f[0][i][j],f[1][j][1]+get_one(sta[2][i]));
}
for (int i=3;i<=n;i++)
for (int j=1;j<=tot[i];j++)
for (int k=1;k<=tot[i-1];k++){
if (sta[i][j]&sta[i-1][k])continue;
for (int a=1;a<=tot[i-2];a++){
if ((sta[i][j]&sta[i-2][a])||(sta[i-1][k]&sta[i-2][a]))continue;
f[i&1][j][k]=max(f[i&1][j][k],f[(i-1)&1][k][a]+get_one(sta[i][j]));
}
}
for (int j=1;j<=tot[n];j++)
for (int k=1;k<=tot[n-1];k++)ans=max(ans,f[n&1][j][k]);
printf("%d\n",ans);
return 0;
}
改完了 前两行特判一下 输出时只考虑最后一行
by jeffqi @ 2018-10-29 17:05:50
@_YPC 而且你的代码在lgIDE上输出也是四
by jeffqi @ 2018-10-29 17:06:13
@jeffyang 打错了 是5
by _YPC @ 2018-10-29 17:48:21
@jeffyang 但是在本地上确实是6啊QAQ
by _YPC @ 2018-10-29 17:48:40
@jeffyang 另外,%%%巨佬QAQ