题意不难理解
dp[ i ][ j ] = dp[ i-1 ][ j ]+dp[ i ][ j-1 ];
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 dp 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 const int maxn = 1005; 7 int dp[ maxn ][ maxn ]; 8 int mat[ maxn ][ maxn ]; 9 int main(){ 10 int ca; 11 scanf("%d",&ca); 12 while( ca-- ){ 13 int n,m; 14 scanf("%d%d",&n,&m); 15 char s[ maxn ]; 16 for( int i=0;i<n;i++ ){ 17 scanf("%s",s); 18 for( int j=0;j<m;j++ ){ 19 if( s[j]=='.' ) mat[i][j] = 1; 20 else mat[i][j] = 0; 21 } 22 } 23 //memset( dp,0,sizeof( dp ) ); 24 if( mat[0][0]==1 ) dp[0][0] = 1; 25 else dp[0][0]=0; 26 for( int i=1;i<m;i++ ){ 27 dp[ 0 ][ i ] = dp[ 0 ][ i-1 ]; 28 if( mat[0][i]==0 ) 29 dp[0][i] = 0; 30 } 31 for( int i=1;i<n;i++ ){ 32 dp[ i ][ 0 ] = dp[ i-1 ][ 0 ]; 33 if( mat[i][0]==0 ) 34 dp[i][0] = 0; 35 } 36 for( int i=1;i<n;i++ ){ 37 for( int j=1;j<m;j++ ){ 38 if( mat[i][j]==1 ) 39 dp[i][j] = dp[i-1][j]+dp[i][j-1]; 40 else dp[i][j]=0; 41 } 42 } 43 printf("Existuje %d ruznych cest.\n",dp[n-1][m-1]); 44 } 45 return 0; 46 } 47 48
不要多余的memset,会TLE。。。