NOI 7614 最低通行费(多段图最短路)

http://noi.openjudge.cn/ch0206/7614/

题意:

有一个N*N的正方形网格,商人从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。

这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?

注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。

 

思路:

对于这种问题,首先就是要处理好边界问题,之后递推即可。

 1 #include<iostream> 
 2 #include<string>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int n;
 8 int a[105][105];
 9 int d[105][105];
10 
11 int main()
12 {
13     //freopen("D:\\txt.txt", "r", stdin);
14     while (cin >> n && n)
15     {
16         for (int i = 1; i <= n; i++)
17         for (int j = 1; j <= n; j++)
18             cin >> a[i][j];
19         d[1][1] = a[1][1];
20         //处理边界
21         for (int i = 2; i <= n; i++)
22             d[i][1] = d[i - 1][1] + a[i][1];
23         for (int i = 2; i <= n; i++)
24             d[1][i] = d[1][i - 1] + a[1][i];
25 
26         for (int i = 2; i <= n;i++)
27         for (int j = 2; j <= n; j++)
28             d[i][j] = min(d[i - 1][j] + a[i][j], d[i][j - 1] + a[i][j]);
29         cout << d[n][n] << endl;
30     }
31     return 0;
32 }

 

posted @ 2017-02-10 09:57  Kayden_Cheung  阅读(364)  评论(0编辑  收藏  举报
//目录