zoukankan      html  css  js  c++  java
  • 动态规划:NOI 2009 管道取珠

    [NOI2009] 管道取珠

    输入文件:ballb.in   输出文件:ballb.out   简单对比
    时间限制:1 s   内存限制:512 MB

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 const int maxn=510;
     6 const int mod=1024523;
     7 char A[maxn],B[maxn];
     8 int dp[maxn][maxn][maxn];
     9 int n,m;
    10 int main(){
    11     freopen("ballb.in","r",stdin);
    12     freopen("ballb.out","w",stdout);
    13     scanf("%d%d",&n,&m);
    14     scanf("%s%s",A+1,B+1);
    15     dp[0][0][0]=1;
    16     for(int i=0;i<=n;i++)
    17         for(int j=0;j<=m;j++)
    18             for(int k=max(i+j-m,0);k<=i+j;k++){
    19                 if(!i&&!j&&!k)continue;
    20                 int l=i+j-k;
    21                 if(A[i]==A[k]&&i&&k)dp[i][j][k]+=dp[i-1][j][k-1];
    22                 if(A[i]==B[l]&&i&&l)dp[i][j][k]+=dp[i-1][j][k];
    23                 if(B[j]==A[k]&&j&&k)dp[i][j][k]+=dp[i][j-1][k-1];
    24                 if(B[j]==B[l]&&j&&l)dp[i][j][k]+=dp[i][j-1][k];
    25                 dp[i][j][k]%=mod;
    26             }
    27     printf("%d
    ",dp[n][m][n]);        
    28     return 0;
    29 }

      最开始想如果不平方,求结果不同的方案个数,发现几乎无法实现。

      这里有平方,就可以这样转化:把每种方案复制一遍,然后配对,只有相同才计入答案,简单地DP一下就解决了。

  • 相关阅读:
    day⑥:logging模块
    day⑥:shelve模块
    day⑥:xml模块
    day⑤:冒泡排序
    day⑤:模块
    day⑤:re深入
    day④:递归
    day④:迭代器
    day④:装饰器
    day③:函数式编程
  • 原文地址:https://www.cnblogs.com/TenderRun/p/5695716.html
Copyright © 2011-2022 走看看