每日一题 5.29 管道取珠

管道取珠

https://ac.nowcoder.com/acm/problem/17621

首先转化问题 可以换一种理解方式
两个人在两个独立的装置里取球 输出队列相同的方案数
因为对于每一种输出队列 第一个人有ai种方案 第二个人有ai种方案
那么两个人输出队列相同的方案总数就是ai*ai
然后就是一个很简单的dp题目了 dp[i][j][k][l]表示第一个人在上管道取了i个 下取了j个 第二个人在上取了k个 下取了l个 l=i+j-k
两个人的输出队列相同的方案数 然后已知答案就是 dp[z][m][n]
然后思考如何转状态转移 根据dp状态的定义 当目前两个人取的球的个数相同才可能发生转移 然后讨论两个人当前从那根管道取的球
空间上有那么一点问题 但是看到第一维可以滚动掉 放心了
代码有详细注释

#include <bits/stdc++.h>
using namespace std;
const int N=505;
const int mod=1024523;
int n,m,dp[2][N][N];
string a,b;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    cin>>a>>b;a=' '+a,b=' '+b;
    dp[0][0][0]=1;
    int z=0;
    for(int i=0;i<=n;i++,z^=1)///第一个人 取上 i个
        for(int j=0;j<=m;j++)/// 1 取下 j个
            for(int k=0;k<=n;k++){/// 2 取上 k 个
                int l=i+j-k;
                int &x=dp[z][j][k];///基础态
                if(l<0||l>m)continue;
                if(a[i+1]==a[k+1])dp[z^1][j][k+1]=(dp[z^1][j][k+1]+x)%mod;
                if(a[i+1]==b[l+1])dp[z^1][j][k]=(dp[z^1][j][k]+x)%mod;
                if(b[j+1]==a[k+1])dp[z][j+1][k+1]=(dp[z][j+1][k+1]+x)%mod;
                if(b[j+1]==b[l+1])dp[z][j+1][k]=(dp[z][j+1][k]+x)%mod;
                x=0;///更新清零
            }
    cout<<dp[z][m][n]<<endl;
    return 0;
}

每日一题题解 文章被收录于专栏

每日一题题解的汇集

全部评论

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务