• hdu4832Chess(dp)


    链接

    这题第一想法是矩阵,不过范围太大了,然后就没有思路了。。

    之后看到群里的解法,行和列可以分着走,两者是互不影响的,这样就把二维转换成了一维,直接dp求出就可以了。

    然后再组合相乘一下。

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<cmath>
     8 #include<queue>
     9 #include<set>
    10 using namespace std;
    11 #define N 1010
    12 #define LL __int64
    13 #define INF 0xfffffff
    14 #define mod 9999991
    15 const double eps = 1e-8;
    16 const double pi = acos(-1.0);
    17 const double inf = ~0u>>2;
    18 LL dp1[N][N],dp2[N][N];
    19 LL o[2][N];
    20 LL c[N][N];
    21 void init()
    22 {
    23      c[0][0] = 1;
    24      for(int i = 1;i < 1010;i++)
    25      {
    26         c[i][0] = c[i][i] = 1;
    27          for(int j = 1; j < i;j++)
    28          {
    29             c[i][j] = c[i-1][j] + c[i-1][j-1];
    30              if(c[i][j] >= mod)
    31                 c[i][j] -= mod;
    32          }
    33     }
    34 }
    35 int main()
    36 {
    37     int n,m,t,k,x,y;
    38     int i,j;
    39     int kk = 0;
    40     init();
    41     cin>>t;
    42     while(t--)
    43     {
    44         memset(dp1,0,sizeof(dp1));
    45         memset(dp2,0,sizeof(dp2));
    46         memset(o,0,sizeof(o));
    47         scanf("%d%d%d%d%d",&n,&m,&k,&x,&y);
    48         dp1[0][x] = 1;o[0][0]+=1;
    49         dp2[0][y] = 1;o[1][0]+=1;
    50         for(i = 1;i <=k ;i++)
    51             for(j = 1; j <=n ;j++)
    52             {
    53                 if(j>1) dp1[i][j]=(dp1[i][j]+dp1[i-1][j-2])%mod;
    54                 dp1[i][j]+=dp1[i-1][j-1];dp1[i][j]%=mod;
    55                 dp1[i][j]+=dp1[i-1][j+1];dp1[i][j]%=mod;
    56                 dp1[i][j]+=dp1[i-1][j+2];dp1[i][j]%=mod;
    57                 o[0][i]+=dp1[i][j];
    58                 o[0][i]%=mod;
    59             }
    60         for(i = 1; i <=k ;i++)
    61             for(j = 1; j <= m ;j++)
    62             {
    63                 if(j>1) dp2[i][j]+=dp2[i-1][j-2];dp2[i][j]%=mod;
    64                 dp2[i][j]+=dp2[i-1][j-1];dp2[i][j]%=mod;
    65                 dp2[i][j]+=dp2[i-1][j+1];dp2[i][j]%=mod;
    66                 dp2[i][j]+=dp2[i-1][j+2];dp2[i][j]%=mod;
    67                 o[1][i]+=dp2[i][j];
    68                 o[1][i]%=mod;
    69             }
    70 
    71         LL ans=0;
    72         for(i = 0; i <= k; i++)
    73         {
    74             ans =(ans+c[k][i]*o[0][i]%mod*o[1][k-i]%mod)%mod;
    75         }
    76         printf("Case #%d:
    ",++kk);
    77         cout<<ans<<endl;
    78     }
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    c++ socket发送数据时,sendData = char * string 导致的乱码问题
    c++ sprintf() 用法
    c++ 将float 类型转换成string 类型
    c++中 string类型 转为 char []类型
    c++ 去掉所有空格及换行符
    c++处理字符串string.find()与string::npos
    C1010 unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source
    C++ socket bind() 函数绑定错误
    windows 全局安装 composer
    VMware Tools (ubuntu系统)安装详细过程与使用
  • 原文地址:https://www.cnblogs.com/shangyu/p/3751707.html
Copyright © 2020-2023  润新知