字符集为2——过河卒变形

字符集为2——过河卒变形

此模型多用于01串、括号串,这种字符集为2的字符串,最好它的个数再给定

1)把01串转化为图上的往右走或者往上走,个数为先限制的图的长宽

2)前缀和后缀可以转化为图上的权值

3)固定的字符可以转化为某个点固定下一步的方向

装化为过河卒问题

eg:牛63 D

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const LL INF=1ll<<60;
const int MAXN=1e3+100;
int N,cnt0,cnt1;
LL pre,suf;
LL mp[MAXN][MAXN],f[MAXN][MAXN],fm[MAXN][MAXN];
char s[MAXN],t[MAXN];
int main()
{
   scanf("%d%d%d%lld%lld",&N,&cnt0,&cnt1,&pre,&suf);
   cnt0++,cnt1++;
   for(int i=0;i<MAXN;++i){
       for(int j=0;j<MAXN;++j){
           fm[i][j]=INF;
           f[i][j]=-INF;
      }
  }
   scanf("%s%s",s+1,t+1);
   int nx=1,ny=1;
   for(int i=1;i<=N;++i){
       if(s[i]=='1') ny+=1;
       else nx+=1;
       if(nx>=1&&nx<=cnt0&&ny>=1&&ny<=cnt1){
           mp[nx][ny]+=pre;
      }else break;
  }
   nx=cnt0,ny=cnt1;
   for(int i=N;i>=1;i--){
       if(s[i]=='1') ny-=1;
       else nx-=1;
       if(nx>=1&&nx<=cnt0&&ny>=1&&ny<=cnt1){
           mp[nx][ny]+=suf;
      }else break;
  }
   f[1][1]=fm[1][1]=mp[1][1];
   for(int i=1;i<=cnt0;++i){
       for(int j=1;j<=cnt1;++j){
           if(i==1&&j==1) continue;
           int cnt=i+j-2;
           if(t[cnt]=='1'){
               f[i][j]=max(f[i][j],f[i][j-1]+mp[i][j]);
               fm[i][j]=min(fm[i][j],fm[i][j-1]+mp[i][j]);
          }else if(t[cnt]=='0'){
               f[i][j]=max(f[i][j],f[i-1][j]+mp[i][j]);
               fm[i][j]=min(fm[i][j],fm[i-1][j]+mp[i][j]);
          }else{
               f[i][j]=max(f[i][j],f[i-1][j]+mp[i][j]);
               f[i][j]=max(f[i][j],f[i][j-1]+mp[i][j]);
               fm[i][j]=min(fm[i][j],fm[i-1][j]+mp[i][j]);
               fm[i][j]=min(fm[i][j],fm[i][j-1]+mp[i][j]);
          }
      }
  }

   printf("%lld %lld\n",fm[cnt0][cnt1],f[cnt0][cnt1]);

   return 0;
}



posted @ 2022-02-26 23:06  fengzlj  阅读(17)  评论(0)    收藏  举报