福建省建设继续教育网站,网络营销的特点有几个,嘉兴网站建设定制,wordpress安装需要什么1018.最低通行费一个商人穿过一个 NN 的正方形的网格#xff0c;去参加一个非常重要的商务活动。他要从网格的左上角进#xff0c;右下角出。每穿越中间 1 个小方格#xff0c;都要花费 1 个单位时间。商人必须在 (2N−1)(2−1) 个单位时间穿越出去。而在经过中间的每个小方…1018.最低通行费一个商人穿过一个 N×N 的正方形的网格去参加一个非常重要的商务活动。他要从网格的左上角进右下角出。每穿越中间 1 个小方格都要花费 1 个单位时间。商人必须在 (2N−1)(2−1) 个单位时间穿越出去。而在经过中间的每个小方格时都需要缴纳一定的费用。这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用注意不能对角穿越各个小方格即只能向上下左右四个方向移动且不能离开网格。输入格式第一行是一个整数表示正方形的宽度 N。后面 N 行每行 N个不大于 100 的正整数为网格上每个小方格的费用。输出格式输出一个整数表示至少需要的费用。数据范围1≤N≤100输入样例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样例解释样例中最小值为 1091257912192133看完这道题就知道是道dp的题。直接写dp方程状态表示f[i][j]表示从左下角到位置 [i,j]的最小值也就是f[i][j] max(f[i - 1][j], f[i][j - 1]) w;而第 i 层的答案只依赖于第 i 层和第 i - 1 层容易想到滚动数组优化在看到方程发现不用滚动数组直接用一维存即可具体解释见代码一维转移f[j] max(f[j], f[j - 1]) w;答案表示用二维存就是 f[n][m]用一维存就是 f[m]注意这道题是求最小值所以要注意边界条件AC代码#include stdio.h
int f[110][110], a[110][110];
int min(int a, int b)
{return a b ? b : a;
}
int main()
{int n, i, j;scanf(%d, n);for(i 1; i n; i)for(j 1; j n; j)scanf(%d, a[i][j]);f[1][1] a[1][1];for(i 2; i n; i) f[i][1] f[i - 1][1] a[i][1];for(j 2; j n; j) f[1][j] f[1][j - 1] a[1][j];for(i 2; i n; i)for(j 2; j n; j)f[i][j] min(f[i - 1][j], f[i][j - 1]) a[i][j];printf(%d, f[n][n]);return 0;
}