萌新初学状压dp,结果样例都没过((⊙o⊙)…)

P2704 [NOI2001] 炮兵阵地

STUDENT00 @ 2022-09-27 20:47:05

代码很好理解的

#include<bits/stdc++.h>
using namespace std;
int n,m,a[101],p,dp[101][101][101],ans;
char c[101][11];
void work(){
    for(int i=1;i<(1<<n);i++){
        if((i&(i<<1))||(i&(i<<2))) continue;
        p++;
        a[p]=i;
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
    work();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=p;j++){
            int s=0,t=a[j];
            while(t){
                t&=(t-1);
                s++;
            }
            for(int z=1;z<=p;z++){
                if(a[j]&a[z]) continue;
                int maxs=0;
                for(int k=1;k<=p;k++){
                    if((a[j]&a[k])||(a[z]&a[k])) continue;
                    maxs=max(maxs,dp[i][z][k]);
                }
                dp[i][j][z]=maxs+s;
            }
        }
    }
    for(int i=1;i<=p;i++){
        for(int j=1;j<=p;j++) ans=max(ans,dp[n][i][j]);
    }
    printf("%d",ans);
    return 0;
}

by 淸梣ling @ 2022-09-27 21:42:08

@YuRuochen 数组开大一点


by STUDENT00 @ 2022-09-27 21:55:36

@淸梣ling dalao,应该不是这个问题吧,毕竟还有WA的呢


by STUDENT00 @ 2022-09-27 21:59:44

@淸梣ling dalao,而且我算了一下,最多只有60种情况(开到100完全完全够)


by STUDENT00 @ 2022-09-27 22:08:50

@淸梣ling dalao,在吗?


by 淸梣ling @ 2022-09-27 22:22:29

@YuRuochen 首先你 dp 数组越界了。至于 WA,我觉得可能是你 line9 有点问题?(我也不太清楚


by 淸梣ling @ 2022-09-27 22:23:12

@YuRuochen 哦,wssb,line10 你写成 n 了


by STUDENT00 @ 2022-09-28 19:21:44

@淸梣ling dalao,对不起,我现在才看到,已经AC了,谢谢大佬!


上一页 |