【noi openjudge】最低通行费

这道题完全没有必要去计算限制时间,把时间当做一个参数来做就行了。
知道了这一点之后就可以直接使用DP求解了

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cmath>
 6 using namespace std;
 7 int Map[105][105]={0},N=0;
 8 int DP[2][105][105]={0};//0时间1钱数
 9 int main(void)
10 {
11 cin>>N;
12 for(int i=1;i<=N;i++)
13 for(int j=1;j<=N;j++)
14 cin>>Map[i][j];
15 memset(DP,127/2,sizeof(DP));
16 for(int i=1;i<=N;i++)
17 for(int j=1;j<=N;j++)
18 DP[0][i][j]=-1;
19 DP[1][N][N]=Map[N][N];
20 DP[0][N][N]=2*N-1;
21 for(int i=N;i>=1;i--)
22 {
23 for(int j=N;j>=1;j--)
24 {
25 DP[1][i-1][j]=min(DP[1][i][j]+Map[i-1][j],DP[1][i-1][j]);
26 DP[0][i-1][j]=max(DP[0][i][j]-1,DP[0][i-1][j]);
27
28 DP[1][i][j-1]=min(DP[1][i][j]+Map[i][j-1],DP[1][i][j-1]);
29 DP[0][i][j-1]=max(DP[0][i][j]-1,DP[0][i][j-1]);
30
31 DP[1][i+1][j]=min(DP[1][i][j]+Map[i+1][j],DP[1][i+1][j]);
32 DP[0][i+1][j]=max(DP[0][i][j]-1,DP[0][i+1][j]);
33
34 DP[1][i][j+1]=min(DP[1][i][j]+Map[i][j+1],DP[1][i][j+1]);
35 DP[0][i][j+1]=max(DP[0][i][j]-1,DP[0][i][j+1]);
36 }
37 }
38 cout<<DP[1][1][1];
39 return 0;
40 }
时间: 2024-08-07 19:57:48

【noi openjudge】最低通行费的相关文章

2971 抓住那头牛 noi.openjudge

http://noi.openjudge.cn/ch0205/2971/ 总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数

【棋盘DP】【OpenJudge7614】最低通行费

最低通行费 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个商人穿过一个 N*N 的正方形的网格,去参加一个非常重要的商务活动.他要从网格的左上角进,右下角出.每穿越中间1个小方格,都要花费1个单位时间.商人必须在(2N-1)个单位时间穿越出去.而在经过中间的每个小方格时,都需要缴纳一定的费用. 这个商人期望在规定时间内用最少费用穿越出去.请问至少需要多少费用? 注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格). 输入第一行是一个整数,表示正方形

noi openjudge 1768:最大子矩阵

http://noi.openjudge.cn/ch0406/1768/ 描述已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 的最大子矩阵是 9 2-4 1-1 8 这个子矩阵的大小是15.输入输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从

NOI题库 / 2.6基本算法之动态规划 - 7614:最低通行费

总时间限制:  1000ms 内存限制:  65536kB 描述 一个商人穿过一个 N*N 的正方形的网格,去参加一个非常重要的商务活动.他要从网格的左上角进,右下角出.每穿越中间1个小方格,都要花费1个单位时间.商人必须在(2N-1)个单位时间穿越出去.而在经过中间的每个小方格时,都需要缴纳一定的费用. 这个商人期望在规定时间内用最少费用穿越出去.请问至少需要多少费用? 注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格). 输入 第一行是一个整数,表示正方形的宽度N

整理小朋友在noi.openjudge上的作业(1)

NOI(题库正在建设中,做题纪录有可能会被删除,请注意) 第一章的统计放前面 1 编程基础之输入输出 10 0 0% 最基础有空补刷 2 编程基础之变量定义.赋值及转换 10 0 0% 最基础有空补刷 3 编程基础之算术表达式与顺序执行 20 0 0% 最基础有空补刷 4 编程基础之逻辑表达式与条件分支 21 0 0% 最基础有空补刷 5 编程基础之循环控制 45 10 22% 最基础有空补刷 6 编程基础之一维数组 15 5 33% 最基础有空补刷 7 编程基础之字符串 35 0 0% 有必要

词典 (noi OpenJudge)

传送门:1806:词典 神奇的STL #include <iostream> #include <cstdio> #include <cstring> #include <map> #include <sstream> using namespace std; string s, s1, s2, word; map <string, string> dic; int main() { while (getline (cin, s) &

noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T11——T20

T11 图像旋转 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= m <= 100.接下来n行,每行m个整数,表示图像的每个像素点灰度.相邻两个整数之间用单个空格隔开,每个元素均在0~255之间. 输出 m行,每行n个整数,为顺时针旋转90度后的图像.相邻两个整数之间用单个空格隔开. 样例输入 3 3 1 2 3 4 5 6 7 8 9 样例输出 7 4 1 8 5

noi题库(noi.openjudge.cn) 1.11编程基础之二分查找T01、02、04

T01 查找最接近的元素 描述 在一个非降序列中,查找与给定值最接近的元素. 输入 第一行包含一个整数n,为非降序列长度.1 <= n <= 100000.第二行包含n个整数,为非降序列各元素.所有元素的大小均在0-1,000,000,000之间.第三行包含一个整数m,为要询问的给定值个数.1 <= m <= 10000.接下来m行,每行一个整数,为要询问最接近元素的给定值.所有给定值的大小均在0-1,000,000,000之间. 输出 m行,每行一个整数,为最接近相应给定值的元素

noi题库(noi.openjudge.cn) 3.9数据结构之C++STL T1——T2

T1 1806:词典 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行.每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开.而且在词典中不会有某个外语单词出现超过两次.词典之后是一个空行,然后给出一个由外语单词组成的文档,文档不超过100000行,而且每行只包括一个外语单词.输入中出现单词只包括小写字母,而且长度不会超过10.输出在输出中,你需要把