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 }