程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva 825 - Walking on the Safe Side(dp)

uva 825 - Walking on the Safe Side(dp)

編輯:C++入門知識

題目大意:給出n,m,現在給出n行數據, 每行有k(k為不定值)個數字, 第一個數字代表行數, 後面k - 1個數代表當前行的這個位置不可走, 問有多少路徑可以從(1,1)到(n,m),只能向下或向右。   解題思路:dp[i][j] = dip[i - 1][j] + dp[i][j - 1], 很簡單的dp問題。    

#include <stdio.h>  
#include <string.h>  
const int N = 1005;  
  
int n, m, dp[N][N], g[N][N];  
  
void handle(int k, char str[]) {  
    int len = strlen(str), num = 0;  
    for (int i = 0; i <= len; i++) {  
        if (str[i] >= '0' && str[i] <= '9')  
            num = num * 10 + str[i] - '0';  
        else {  
            g[k][num] = 1;  
            num = 0;  
        }  
    }  
}  
  
void read() {  
    int r;  
    char str[N];  
    memset(dp, 0, sizeof(dp));  
    memset(g, 0, sizeof(g));  
    scanf("%d%d", &n, &m);  
    for (int i = 0; i < n; i++) {  
        scanf("%d", &r);  
        gets(str);  
        handle(r, str);  
    }  
}  
  
int solve () {  
    dp[0][1] = 1;  
    for (int i = 1; i <= n; i++) {  
        for (int j = 1; j <= m; j++) {  
            if (g[i][j])    continue;  
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];  
        }  
    }  
    return dp[n][m];  
}  
  
int main() {  
    int cas;  
    scanf("%d", &cas);  
    while (cas--) {  
        read();  
        printf("%d\n", solve());  
        if (cas) printf("\n");  
    }  
    return 0;  
}  

 

   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved