zoukankan      html  css  js  c++  java
  • 解题:NOI 2009 管道取珠

    题面

    考虑这个平方的实际意义,实际是说取两次取出一样的序列

    那么设$dp[i][j][k][h]$表示第一次在上面取$i$个下面取$j$个,第二次在上面取$k$个下面取$h$个的方案数

    等等$n^4$根本开不下+过不去啊=。=

    发现$i,j,k$固定时$h$可以算出来,于是少一个$n$的复杂度

    建议填表转移,每次从$dp[i][j][k]$转移过去,所以如果空间不够就把$i$滚掉

    提示:被卡常的尝试统计的时候判一下是否有值就能过了。。。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=510,mod=1024523;
     6 int n,m,noww,last,dp[2][N][N];
     7 char a[N],b[N];
     8 void Mod(int &x)
     9 {
    10     if(x>=mod) x-=mod;
    11 }
    12 int main()
    13 {
    14     register int i,j,k;
    15     scanf("%d%d%s%s",&n,&m,a+1,b+1);
    16     dp[0][0][0]=noww=1;
    17     for(i=0;i<=n;i++)
    18     {
    19         memset(dp[noww],0,sizeof dp[noww]);
    20         for(j=0;j<=m;j++)
    21             for(k=0;k<=n;k++)
    22             {
    23                 int h=i+j-k,las=dp[last][j][k];
    24                 if(h>=0&&h<=m&&las)
    25                 {
    26                     if(a[i+1]==a[k+1]) Mod(dp[noww][j][k+1]+=las);
    27                     if(a[i+1]==b[h+1]) Mod(dp[noww][j][k]+=las);
    28                     if(b[j+1]==b[h+1]) Mod(dp[last][j+1][k]+=las);
    29                     if(b[j+1]==a[k+1]) Mod(dp[last][j+1][k+1]+=las);
    30                 }
    31             }
    32         last=noww,noww^=1;
    33     }
    34     printf("%d",dp[noww][m][n]);
    35     return 0;
    36 }
    View Code
  • 相关阅读:
    first root
    C r and n(组合数)
    学习笔记
    zabbix历史数据全部清楚
    Jetson TX2安装固态硬盘(原创)
    Jetson TX2安装tensorflow(原创)
    机器视觉编程作业02(01)(原创)
    机器视觉编程作业02(00)EM算法
    机器视觉 编程作业题 第一题(01)(原创)
    动态代理
  • 原文地址:https://www.cnblogs.com/ydnhaha/p/10222142.html
Copyright © 2011-2022 走看看