ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

D 牛牛的01限定串 传纸条、走下去类型的模型题

2020-05-16 13:02:43  阅读:229  来源: 互联网

标签:01 val 牛牛 纸条 long d% int valsuf MAXN


链接:https://ac.nowcoder.com/acm/contest/5531/D

题解链接:https://ac.nowcoder.com/discuss/424000?type=101&order=0&pos=34&page=1

思路:这是一道传纸条、走下去类型的模型题;

   但假如这方面做的不够多的话,还是很难想到的。。。

   思路在上方题解链接

   具体情况注释在代码中

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3  
 4 const int MAXN=1e3+10;
 5 long long val[MAXN][MAXN];
 6 long long dp1[MAXN][MAXN],dp2[MAXN][MAXN];
 7 char s[MAXN],t[MAXN];
 8 int n,cnt0,cnt1,valpre,valsuf;
 9  
10 int main(){
11     scanf("%d%d%d%d%d",&n,&cnt0,&cnt1,&valpre,&valsuf);
12     scanf("%s%s",s+1,t+1);
13     //初始化
14     for(int i=0;i<=n;i++)
15         for(int j=0;j<=n;j++)
16             dp1[i][j]=-2e18,dp2[i][j]=2e18;
17     int x=0,y=0;
18     for(int i=1;i<=n;i++){
19         if(s[i]=='1')x++;
20         else y++;
21         if(x<=cnt1&&y<=cnt0)val[x][y]+=valpre;
22     }
23     //把相似前缀的情况枚举,记录权值
24     x=cnt1,y=cnt0;
25     for(int i=n;i;i--){
26         if(s[i]=='1')x--;
27         else y--;
28         if(x>=0&&y>=0)val[x][y]+=valsuf;
29     }
30     //把相似后缀的情况枚举,记录权值
31     dp1[0][0]=dp2[0][0]=val[0][0];
32     
33     //跑矩阵的时候,类似于走下去模型,只能向下或者向右走
34     //但是,这道题还有一个限制,就是在某一步可能会限制只能向下或者向右
35     //假如是‘?’ 就没限制,假如是‘0’或者‘1’就有限制
36     for(int i=0;i<=cnt1;i++){
37         for(int j=0;j<=cnt0;j++){
38             if(i+j==0)continue;
39             if(t[i+j]=='1'&&i){
40                 dp1[i][j]=max(dp1[i][j],dp1[i-1][j]+val[i][j]);
41                 dp2[i][j]=min(dp2[i][j],dp2[i-1][j]+val[i][j]);
42             }else if(t[i+j]=='0'&&j){
43                 dp1[i][j]=max(dp1[i][j],dp1[i][j-1]+val[i][j]);
44                 dp2[i][j]=min(dp2[i][j],dp2[i][j-1]+val[i][j]);
45             }else if(t[i+j]=='?'){
46                 if(j)dp1[i][j]=max(dp1[i][j],dp1[i][j-1]+val[i][j]);
47                 if(j)dp2[i][j]=min(dp2[i][j],dp2[i][j-1]+val[i][j]);
48                 if(i)dp1[i][j]=max(dp1[i][j],dp1[i-1][j]+val[i][j]);
49                 if(i)dp2[i][j]=min(dp2[i][j],dp2[i-1][j]+val[i][j]);
50             }
51         }
52     }
53     printf("%lld %lld",dp2[cnt1][cnt0],dp1[cnt1][cnt0]);
54     return 0;
55 }
View Code

 

标签:01,val,牛牛,纸条,long,d%,int,valsuf,MAXN
来源: https://www.cnblogs.com/pangbi/p/12899996.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有