Metro

原创 2016年08月28日 15:01:41

http://acm.timus.ru/problem.aspx?space=1&num=1119


Many of SKB Kontur programmers like to get to work by Metro because the main office is situated quite close the station Uralmash. So, since a sedentary life requires active exercises off-duty, many of the staff — Nikifor among them — walk from their homes to Metro stations on foot.
Problem illustration
Nikifor lives in a part of our city where streets form a grid of residential quarters. All the quarters are squares with side 100 meters. A Metro entrance is situated at one of the crossroads. Nikifor starts his way from another crossroad which is south and west of the Metro entrance. Naturally, Nikifor, starting from his home, walks along the streets leading either to the north or to the east. On his way he may cross some quarters diagonally from their south-western corners to the north-eastern ones. Thus, some of the routes are shorter than others. Nikifor wonders, how long is the shortest route.
You are to write a program that will calculate the length of the shortest route from the south-western corner of the grid to the north-eastern one.

题意:从左下角到右上角的最短路径长,地图上可以向上向右,有斜线的地方可以沿着斜线方向走。
分析:简单dp,从终点开始,最优解为左边一点+1,下边一点+1,左下一点+根号2(如果有边)的最小值。把最左边和最下边的点初始化一下比较方便。

题解:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <cstring>
#include <functional>
#include <cmath>
using namespace std;

bool path[1010][1010];
double dp[1010][1010];
int main()
{
	//freopen("in.txt", "r", stdin);
	int m, n;
	while (~scanf("%d %d",&n,&m))
	{
		memset(path, 0, sizeof(path));
		int k, x, y;
		scanf("%d", &k);
		for (int i = 0; i < k; i++)
		{
			scanf("%d %d", &x, &y);
			path[x][y] = true;
		}
		dp[0][0] = 0;
		for (int i = 1; i < n + 1; i++)
			dp[i][0] = dp[i - 1][0] + 1;
		for (int i = 1; i < m + 1; i++)
			dp[0][i] = dp[0][i-1] + 1;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m;j++)
			{
				if (path[i][j]==true)
				{
					dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + sqrt(2.0f)));
				}
				else
					dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
			}
		printf("%.f", dp[n][m] * 100);

	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

metro_icon

  • 2016-08-05 11:22
  • 22.05MB
  • 下载

Windows Store apps开发[18]Metro Revealed Building Windows 8 apps with XAML and C#中文翻译全部汇总

注:本系列学习帖子我在DevDiv.com移动开发社区原创首发         转载请注明出处:BeyondVincent(破船)@DevDiv.com 如果你有什么问题也可以前往交流 下面是首...

Metro文件夹浏览框

  • 2015-07-27 21:41
  • 1.92MB
  • 下载

win 8 桌面 metro 风格

  • 2015-04-10 16:44
  • 87KB
  • 下载

Windows8开发指南(16)开发基于Windows8的第一个metro界面C++程序

微软公布了Windows8开发人员预览版,http://msdn.microsoft.com/en-us/windows/home?ocid=ban-f-cn-dca-Sep-Win8Build  大...

UVA 1025 A Spy in the Metro [动态规划] [DAGdp]

A Spy in the MetroTime Limit: 3000MS 64bit IO Format: %lld & %llu 抓住时间这个天然的顺序。 每一个状态(...

Bootstrap Metro Dashboard

  • 2017-08-18 15:03
  • 4.21MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)