关于#1

P2704 [NOI2001] 炮兵阵地

Textbook_blasphemy @ 2021-07-11 10:55:58

90分代码:

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,m,dp[N][N][N],mp[N],cnt;
struct P{
    int s,num;
}a[N];
char ch;
void pre();
void clean();
int MAX;
int main(){
    clean();
    scanf("%d%d",&n,&m);
    MAX=1<<m;
    getchar();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%c",&ch);
            mp[i]=mp[i]<<1;
            if(ch=='P'){
                mp[i]+=1;
            }else{
                mp[i]+=0;
            }
        }
        getchar();
    }
    pre();
    for(int i=3;i<=n;i++){
        for(int j=1;j<=cnt;j++){
            if((mp[i]&a[j].s)==a[j].s){
                for(int k=1;k<=cnt;k++){
                    if(!(a[j].s&a[k].s)){
                        for(int z=1;z<=cnt;z++){
                            if((!(a[k].s&a[z].s))&&(!(a[j].s&a[z].s))){
                                dp[i][k][j]=max(dp[i][k][j],dp[i-1][z][k]+a[j].num);
                            }
                        }
                    }
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=cnt;i++){
        for(int j=1;j<=cnt;j++){
            ans=max(ans,dp[n][i][j]);
        }
    }
    printf("%d",ans);
    return 0;
}
void pre(){
    for(int i=0;i<MAX;i++){
        if((i&(i<<1))||(i&(i<<2))||(i&(i>>1))||(i&(i>>2))){
            continue;
        }
        cnt++;
        a[cnt].s=i;
        for(int j=0;(1<<j)<=i;j++){
            a[cnt].num+=!!(i&(1<<j));
        }
        if((i&mp[1])==i){
            dp[1][0][cnt]=a[cnt].num;
        }
    }
    for(int i=1;i<=cnt;i++){
        for(int j=1;j<=cnt;j++){
            if((!(a[i].s&a[j].s))&&(mp[2]&a[j].s)==a[j].s){
                dp[2][i][j]=dp[1][0][i]+a[j].num;
            }
        }
    }
}
void clean(){
    memset(a,0,sizeof(a));
    memset(dp,0,sizeof(dp));
    memset(mp,0,sizeof(mp));
    n=m=cnt=0;
}

#1数据为样例数据

该代码在本地及敝校OJ运行结果为正确答案(6),但在洛谷测评姬及在线IDE上结果为5.

求解答(轻喷)


by fanypcd @ 2021-07-11 10:59:15

@陶(戴)佳伟 本地编译开一下 -std=c++11 再试试


by Textbook_blasphemy @ 2021-07-11 11:02:29

@fanypcd 开了,答案仍是6


by Textbook_blasphemy @ 2021-07-11 11:04:00

问题是在Luogu上答案不对


by __ZXYAKIOI__ @ 2021-07-11 11:11:25

https://www.luogu.com.cn/discuss/show/316981


by fanypcd @ 2021-07-11 11:14:02

@陶(戴)佳伟 读入出问题了

最好不要读 char


#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,m,dp[N][N][N],mp[N],cnt;
struct P{
    int s,num;
}a[N];
char ch[15];
void pre();
void clean();
int MAX;
int main(){
    clean();
    scanf("%d%d",&n,&m);
    MAX=1<<m;
    getchar();
    for(int i=1;i<=n;i++){
        scanf("%s",ch + 1);
        for(int j=1;j<=m;j++){
            mp[i]=mp[i]<<1;
            if(ch[i]=='P'){
                mp[i]+=1;
            }else{
                mp[i]+=0;
            }
        }
    }
    pre();
    for(int i=3;i<=n;i++){
        for(int j=1;j<=cnt;j++){
            if((mp[i]&a[j].s)==a[j].s){
                for(int k=1;k<=cnt;k++){
                    if(!(a[j].s&a[k].s)){
                        for(int z=1;z<=cnt;z++){
                            if((!(a[k].s&a[z].s))&&(!(a[j].s&a[z].s))){
                                dp[i][k][j]=max(dp[i][k][j],dp[i-1][z][k]+a[j].num);
                            }
                        }
                    }
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=cnt;i++){
        for(int j=1;j<=cnt;j++){
            ans=max(ans,dp[n][i][j]);
        }
    }
    printf("%d",ans);
    return 0;
}
void pre(){
    for(int i=0;i<MAX;i++){
        if((i&(i<<1))||(i&(i<<2))||(i&(i>>1))||(i&(i>>2))){
            continue;
        }
        cnt++;
        a[cnt].s=i;
        for(int j=0;(1<<j)<=i;j++){
            a[cnt].num+=!!(i&(1<<j));
        }
        if((i&mp[1])==i){
            dp[1][0][cnt]=a[cnt].num;
        }
    }
    for(int i=1;i<=cnt;i++){
        for(int j=1;j<=cnt;j++){
            if((!(a[i].s&a[j].s))&&(mp[2]&a[j].s)==a[j].s){
                dp[2][i][j]=dp[1][0][i]+a[j].num;
            }
        }
    }
}
void clean(){
    memset(a,0,sizeof(a));
    memset(dp,0,sizeof(dp));
    memset(mp,0,sizeof(mp));
    n=m=cnt=0;
}

by Textbook_blasphemy @ 2021-07-11 11:17:32

@fanypcd 确实过了#1但是也只过了#1

用cin过了

谢谢!


by fanypcd @ 2021-07-11 11:34:58

@陶(戴)佳伟 因为 ch 数组开小了...


|