每日一题 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;
}

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

每日一题题解的汇集

全部评论

相关推荐

求offer的大角牛:不吃香菜
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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