https://vjudge.net/contest/177552#problem/V
参考https://vjudge.net/solution/8102820
还是只能看别人的,
他这里预处理。。
所以存的就不是(1<<10)那么大的数了,所以可以保存上一个的状态和这一个的状态。。
自己太粗心了。。弄了挺久都没改出来。。。(以后再改吧。。)
int n,m;
vector<int>state[110];
int dp[110][N][N];
char s[110][15];
void solve(){
for(int i=1;i<=n;++i){
for(int j=0;j<state[i].size();++j){
int num=0,t=state[i][j];
while(t){
t&=t-1;num++;
}
if(i==1)dp[i][j][0]=num;
else{
for(int last=0;last<state[i-1].size();++last){
if(!(state[i][j]&state[i-1][last])){
if(i==2)dp[i][j][last]=max(dp[i][j][last],num+dp[i-1][last][0]);
else{
for(int z=0;z<state[i-2].size();++z)
if(!(state[i][j]&state[i-2][z]))
dp[i][j][last]=max(dp[i][j][last],dp[i-1][last][z]+num);
}
}
}
}
}
}
}
int main(){
while(~sf("%d%d",&n,&m)){
mem(dp,0); int ans=0;
rep(i,1,n){ sf("%s",s[i]); }
int up=(1<<m)-1;
for(int i=1;i<=n;++i){
state[i].clear();
int t=0;
for(int k=0;k<m;++k){
t+=(1<<k)+s[i][k]=='P'?0:1;
}
for(int j=0;j<=up;++j){
if(!(j&(j>>1))&&!(j&(j>>2))&&!(j&(j<<1))&&!(j&(j<<2))&&!(j&t))
state[i].push_back(j);
}
}
solve();
for(int i=0;i<state[n].size();++i){
if(n==1)ans=max(ans,dp[1][i][0]);
else for(int j=0;j<state[n-1].size();++j)
ans=max(ans,dp[n][i][j]);
}
pf("%d\n",ans);
}
}
本文针对 VJudge 竞赛中的一道题目进行了详细的解析,使用动态规划算法进行解答。通过预处理状态并优化存储方式,有效地解决了问题。文章详细展示了代码实现过程及关键步骤。
349

被折叠的 条评论
为什么被折叠?



