NC17621 管道取珠(模型转换+DP)
管道取珠
https://ac.nowcoder.com/acm/problem/17621
题意:
题解:
AC代码
/* Author:zzugzx Lang:C++ Blog:blog.csdn.net/qq_43756519 */ #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define endl '\n' typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int mod=1024523; //const int mod=998244353; const double eps = 1e-10; const double pi=acos(-1.0); const int maxn=1e6+10; const ll inf=0x3f3f3f3f; const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int n,m; int dp[2][510][510]; string a,b; int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); cin>>n>>m; cin>>a>>b;a='.'+a,b='.'+b; dp[0][0][0]=1; int cur=0; for(int i=0;i<=n;i++,cur^=1) for(int j=0;j<=m;j++) for(int k=0;k<=n;k++){ int l=i+j-k; int &x=dp[cur][j][k]; if(l<0||l>m)continue; if(a[i+1]==a[k+1])dp[cur^1][j][k+1]=(dp[cur^1][j][k+1]+x)%mod; if(a[i+1]==b[l+1])dp[cur^1][j][k]=(dp[cur^1][j][k]+x)%mod; if(b[j+1]==a[k+1])dp[cur][j+1][k+1]=(dp[cur][j+1][k+1]+x)%mod; if(b[j+1]==b[l+1])dp[cur][j+1][k]=(dp[cur][j+1][k]+x)%mod; x=0; } cout<<dp[cur][m][n]; return 0; }
每日一题 文章被收录于专栏
每日一题