3251:最少費用

題目連接:百鍊題庫 http://bailian.openjudge.cn/practice/3251
總時間限制: 1000ms 內存限制: 65536kB
描述
一個商人穿過一個正方形的網格,每通過網格上的一個點須要繳納必定的費用。每行和每列上的點費用都是按照從小到大順序排列的,而且對於每一個網格上的點,其先後左右的各個點的收費都是不同的。
編寫程序設計一個商人總左上角走到右下角花費的最小費用。
輸入
第一行是一個整數,表示正方行的寬度N (N <100),
後面n行n列爲網格上每一個點的費用
輸出
一行,表示最小費用
樣例輸入
5
1  4  6  8  10 
2  5  7  15 17 
6  8  9  18 20 
10 11 12 19 21 
20 23 25 29 33 
樣例輸出
109
提示
能夠用遞歸方法,或者動態規劃方法
來源
cs10107 C++ Final Exam

分析:spa

假設a[i][j]表示從左上角走到a[i][j]的最小代價。那麼有以下的遞推式:設計

a[i][j]=min(  a[i][j-1],  a[i-1][j]  )+a[i][j],其中i,j大於0.code

當i==j==0時,a[i][j]就是題目輸入的a[0][0].blog

當i==0&&j!=0時,a[i][j]=a[i][j-1]+a[i][j]遞歸

當i!=0&&j==0時,a[i][j]=a[i-1][j]+a[i][j].內存

因此代碼以下:string

 1 #include<string.h>
 2 #include<stdio.h>
 3 
 4 int n;
 5 int matrix[100][100];
 6 int value[100][100];
 7  
 8 int main()
 9 {
10     scanf("%d", &n);
11     for (int i = 0; i < n; i++)
12     {
13         for (int j = 0; j < n; j++)
14         {
15             int temp;
16             scanf("%d", &temp);
17             matrix[i][j] = temp;
18         }
19     }
20  
21     for (int i = 0; i < n; i++)
22     {
23         for (int j = 0; j < n; j++)
24         {
25             if ((i == 0) && (j == 0))
26             {
27                 value[i][j] = matrix[i][j];
28             }
29             else if ((i == 0) && (j != 0))
30             {
31                 value[i][j] = matrix[i][j] + value[i][j - 1];
32             }
33             else if ((i != 0) && (j == 0))
34             {
35                 value[i][j] = matrix[i][j] + value[i - 1][j];
36             }
37             else
38             {
39                 int a = matrix[i][j] + value[i - 1][j];
40                 int b = matrix[i][j] + value[i][j - 1];
41                 value[i][j] = (a > b) ? b : a;
42             }
43  
44         }
45     } 
46     printf("%d", value[n - 1][n - 1]); 
47     return 0; 
48 }
相關文章
相關標籤/搜索