【动态规划】抄近路

【动态规划】抄近路
时间限制: 1 Sec 内存限制: 64 MB
提交: 105 解决: 68
[提交] [状态] [命题人:admin]
题目描述
“最近不知道怎么回事,感觉我们这个城市变成了一个神奇的地方,有时在路上走着走着人就消失了!走着走着突然又有人出现了!你以为这是《寂静岭》,《生化危机》,《行尸走肉》拍摄地?……哎,先不说了,这该死的雾霾又让我们迷路了。”李旭琳发愁地说。

张琪曼和李旭琳每天要从家到车站,小区被道路分成许多正方形的块,共有N×M块。由于道路太多以及雾霾的影响,她们总是迷路,所以你需要帮她们计算一下从家到车站的最短距离。注意,一般情况下,小区内的方块建有房屋,只能沿着附近的街道行走,有时方块表示公园,那么就可以直接穿过。

输入
第一行是N和M(0<N,M≤1000)。注意,李旭琳家坐标在方块(1,1)的西南角,车站在方块(M,N)的东北角。每个方块边长100米。接下来一行是整数K,表示可以对角线穿过的方块坐标,然后有K行,每行是一个坐标。

输出
输出最短距离,四舍五入到整数米。

样例输入
复制样例数据
3 2
3
1 1
3 2
1 2
样例输出
383

解题思路:i
已知可以走的方向有上、下、左、右,且有的方块允许走对角线,因此可以用dp[i][j]dp[i][j]dp[i][j]代表做到坐标为(i,j)(i,j)(i,j)位置所走的最小路程,因此此时仅需先判断其上一步是否能到达,再更新dp[i][j]即可dp[i][j]即可dp[i][j]
dp[i][j]=min(dp[i][j],dp[i−1][j]+100.0)dp[i][j]=min(dp[i][j],dp[i-1][j]+100.0)dp[i][j]=min(dp[i][j],dp[i1][j]+100.0)从左面到达(i,j)(i,j)(i,j)
dp[i][j]=min(dp[i][j],dp[i][j−1]+100.0)dp[i][j]=min(dp[i][j],dp[i][j-1]+100.0)dp[i][j]=min(dp[i][j],dp[i][j1]+100.0)从下面到达(i,j)(i,j)(i,j)
dp[i][j]=min(dp[i][j],dp[i+1][j]+100.0)dp[i][j]=min(dp[i][j],dp[i+1][j]+100.0)dp[i][j]=min(dp[i][j],dp[i+1][j]+100.0)从右面到达(i,j)(i,j)(i,j)
dp[i][j]=min(dp[i][j],dp[i][j+1]+100.0)dp[i][j]=min(dp[i][j],dp[i][j+1]+100.0)dp[i][j]=min(dp[i][j],dp[i][j+1]+100.0)从上面到达(i,j)(i,j)(i,j)
dp[i][j]=min(dp[i][j],dp[i−1][j−1]+100.0∗sqrt(2.0))dp[i][j]=min(dp[i][j],dp[i-1][j-1]+100.0*sqrt(2.0))dp[i][j]=min(dp[i][j],dp[i1][j1]+100.0sqrt(2.0))从左下角到达(i,j)(i,j)(i,j)
dp[i][j]=min(dp[i][j],dp[i−1][j+1]+100.0∗sqrt(2.0))dp[i][j]=min(dp[i][j],dp[i-1][j+1]+100.0*sqrt(2.0))dp[i][j]=min(dp[i][j],dp[i1][j+1]+100.0sqrt(2.0))从右下角到达(i,j)(i,j)(i,j)
dp[i][j]=min(dp[i][j],dp[i+1][j−1]+100.0∗sqrt(2.0))dp[i][j]=min(dp[i][j],dp[i+1][j-1]+100.0*sqrt(2.0))dp[i][j]=min(dp[i][j],dp[i+1][j1]+100.0sqrt(2.0))从左上角到达(i,j)(i,j)(i,j)
dp[i][j]=min(dp[i][j],dp[i+1][j+1]+100.0∗sqrt(2.0))dp[i][j]=min(dp[i][j],dp[i+1][j+1]+100.0*sqrt(2.0))dp[i][j]=min(dp[i][j],dp[i+1][j+1]+100.0sqrt(2.0))从右上角到达(i,j)(i,j)(i,j)

代码:

//#pragma GCC optimize(3,"Ofast","inline")
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
double dp[1200][1200];
bool vis[1200][1200];
bool can[1200][1200];
int main() 
{#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif//freopen("out.txt", "w", stdout);//ios::sync_with_stdio(0),cin.tie(0);int m,n;scanf("%d %d",&n,&m);int k;scanf("%d",&k);rep(i,0,n) {rep(j,0,m) {dp[i][j]=inf;}}dp[0][0]=0;rep(i,1,k) {int a,b;scanf("%d %d",&a,&b);can[a][b]=true;}vis[0][0]=true;rep(i,0,n) {rep(j,0,m) {if(vis[i-1][j]) dp[i][j]=min(dp[i][j],dp[i-1][j]+100.0);if(vis[i][j-1]) dp[i][j]=min(dp[i][j],dp[i][j-1]+100.0);if(vis[i+1][j]) dp[i][j]=min(dp[i][j],dp[i+1][j]+100.0);if(vis[i][j+1]) dp[i][j]=min(dp[i][j],dp[i][j+1]+100.0);if(vis[i-1][j-1]&&can[i][j]) dp[i][j]=min(dp[i][j],dp[i-1][j-1]+100.0*sqrt(2.0));if(vis[i-1][j+1]&&can[i][j+1]) dp[i][j]=min(dp[i][j],dp[i-1][j+1]+100.0*sqrt(2.0));if(vis[i+1][j-1]&&can[i+1][j]) dp[i][j]=min(dp[i][j],dp[i+1][j-1]+100.0*sqrt(2.0));if(vis[i+1][j+1]&&can[i+1][j+1]) dp[i][j]=min(dp[i][j],dp[i+1][j+1]+100.0*sqrt(2.0));vis[i][j]=true;//cout<<i<<" "<<j<<" "<<(int)dp[i][j]<<endl;}}printf("%.f\n",dp[n][m]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划】魔法石矿

【动态规划】魔法石矿 时间限制: 1 Sec 内存限制: 64 MB 提交: 116 解决: 27 [提交] [状态] [命题人:admin] 题目描述 为了找到回家的路&#xff0c;张琪曼施展魔法&#xff0c;从高维空间召唤出了一种叫作“读者”的生物&#xff0c;据说“读者”这种生物无所不能&#xff0c;…

Knapsack Cryptosystem【折半+查找】

链接&#xff1a;https://ac.nowcoder.com/acm/contest/889/D 来源&#xff1a;牛客网 Amy asks Mr. B problem D. Please help Mr. B to solve the following problem. Amy wants to crack Merkle–Hellman knapsack cryptosystem. Please help it. Given an array {ai} wi…

All men are brothers【并查集+数学】

链接&#xff1a;https://ac.nowcoder.com/acm/contest/889/E 来源&#xff1a;牛客网 题目描述 Amy asks Mr. B problem E. Please help Mr. B to solve the following problem. There are n people, who don’t know each other at the beginning. There are m turns. In e…

Light bulbs【差分】

19.98% 1000ms 8192K There are NN light bulbs indexed from 00 to N-1N−1. Initially, all of them are off. A FLIP operation switches the state of a contiguous subset of bulbs. FLIP(L, R)FLIP(L,R)means to flip all bulbs xx such that L \leq x \leq RL≤x≤R. S…

Digit sum【暴力+打表】

Digit sum 33.57% 2000ms 131072K A digit sum S_b(n)S b ​ (n) is a sum of the base-bb digits of nn. Such as S_{10}(233) 2 3 3 8S 10 ​ (233)2338, S_{2}(8)1 0 0 1S 2 ​ (8)1001, S_{2}(7)1 1 1 3S 2 ​ (7)1113. Given NN and bb, you need to calcu…

P1040 加分二叉树【dp+深搜】

题目描述 设一个nn个节点的二叉树tree的中序遍历为&#xff08;1,2,3,…,n1,2,3,…,n&#xff09;&#xff0c;其中数字1,2,3,…,n1,2,3,…,n为节点编号。每个节点都有一个分数&#xff08;均为正整数&#xff09;&#xff0c;记第ii个节点的分数为di,treedi,tree及它的每个子树…

Helloworld【C#】

c#Helloworld 题目描述 请输出样例所示内容 输出 样例输出 ********** Hello,world! ********** using System;namespace ConsoleApp1 {class Program{static void Main(string[] args){Console.WriteLine("**********");Console.WriteLine("Hello,world!&…

判断闰年【C#】

判断闰年 题目描述 使用C#编写一个控制台应用。输入-一个年份&#xff0c;判断是否润年(被4整除&#xff0c;且不被100整除&#xff0c;或者被400整除)。 是闰年输出yes&#xff0c;不是输出no 输入 一个年份 输出 yes或者no 样例输入 1996 样例输出 yes using Syst…

采用递归求第n位数【C#】

题目描述 一数列的规则如下&#xff1a;1、1、2、3、5、8、13、21、34......。求第n位数是多少&#xff1f; 输入 输入一个正整数&#xff0c;代表求第几位数字 输出 输出第n位数字 样例输入 30 样例输出 832040 提示 输入数字必须大于零 using System;namespace C…

歌手的分数【C#】

歌手的分数 题目描述 一青年歌手参加比赛。使用C#编写-一个控制台应用&#xff0c;输入10位评委打分(分值只能为正整数)&#xff0c;计算并输出歌手的平均分(去掉一一个最高分和一一个最低分)。平均分以double数据类型输出。 输入 1 2 3 4 5 6 7 8 9 10 输出 5.5 样例输…

冒泡排序算法(C#)

冒泡排序算法&#xff08;C#&#xff09; 题目描述 使用C#编写一个控制台应用。输入10个整数存入数组中&#xff0c;然后使用冒泡排序算法对一维数组的元素从小到大进行排序&#xff0c;并输出。 输入 在控制台中输入数字&#xff0c;存入一维数组 输出 输出排序后的数…

水仙花数【C#】

题目描述 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff0c;他是这样定义的&#xff1a; “水仙花数”是指一个三位数&#xff0c;它的各位数字的立方和等于其本身&#xff0c;比如&#xff1a;1531^35^33^3。 现在要求输出…

C#异或运算符的使用【C#】

C#异或运算符的使用 题目描述 编写一个控制台应用&#xff0c;采用异或运算符&#xff0c;实现两个整型变量值的交换。并在Program类的Main进行验证。 输入 依次输入2个整数 输出 输出交换前、后两个变量的值 样例输入 12 78样例输出 before exchange first12,second7…

C#类方法【C#】

C#类方法 题目描述 在类Class1中&#xff0c;编写一个类方法IsEven(string number)用于输出参数的奇偶性。并在Program类的Main进行验证性输出。 class Program { static void Main(string[] args) { Console.Write("Input Integer:&quo…

C#中的Switch语句【C#】

C#中的Switch语句 题目描述 编写一个控制台应用&#xff0c;实现以下功能&#xff1a;根据输入的字符&#xff0c;输出通过、不通过和输入成绩无效。 &#xff08;1&#xff09;无论输入A、B、C、D&#xff0c;都输出通过&#xff1b; &#xff08;2&#xff09;输入E&#x…

c#输出最大值、最小值和平均值(A)【C#】

c#输出最大值、最小值和平均值(A) 题目描述 使用C#编写一个控制台应用。输入10个正整数存入数组中&#xff0c;输出最大值、最小值和平均值 输入 输入10个正整数 输出 最大值、最小值和平均值 样例输入 1 2 3 4 5 6 7 8 9 10 样例输出 10 1 5.5 using System;namesp…

c#输出最大值、最小值和平均值(B)【C#】

c#输出最大值、最小值和平均值&#xff08;B&#xff09; 题目描述 使用C#编写一个控制台应用。输入若干个正整数存入数组中&#xff08;输入exit表示输入结束&#xff09;&#xff0c;输出最大值、最小值和平均值输入 输入若干个正整数存入数组中输出 输出最大值、最小值和平…

C#提取文件名【C#】

C#提取文件名 题目描述 假设有一个字符串包含了文件名、扩展名和路径&#xff0c;如strFileName“D:\C#程序设计\实验3\MyFile.TXT”。请使用C#编写一个静态方法&#xff0c;该方法能够取出路径中的文件名“MyFile.TXT”。 输入 一个包含了文件名&#xff0c;扩展名和路径的…

C#解密出生日期【C#】

C#解密出生日期 题目描述 使用C#编写一个静态方法。该方法能够根据出生日期&#xff0c;&#xff08;1&#xff09;计算此人的年龄&#xff1b;&#xff08;2&#xff09;计算从现在到其60周岁期间&#xff0c;总共多少天。 输入 一个人的出生日期&#xff1b; 输出 第一…

C#判断回文字符串【C#】

C#判断回文字符串 题目描述 使用C#编写一个静态方法。该方法能够判断字符串是否是“回文”&#xff08;即顺读和逆读相同的字符串&#xff09;。 输入 一个字符串&#xff1b; 输出 如果是回文字符串&#xff0c;则输出“yes”&#xff0c;否则输出“no”&#xff1b; 样…