拜访-动态规划

现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。

给定一个地图map及它的长宽nm,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。

测试样例:

[[0,1,0],[2,0,0]],2,3
返回:2
 1 lass Visit {
 2 public:
 3
 4
 5     int countPath(vector<vector<int> > map, int n, int m) {
 6         // write code here
 7         int x1,y1;
 8         int x2,y2;
 9         for(int i=0;i<n;i++)
10         {
11             for(int j=0;j<m;j++)
12             {
13                 if(map[i][j]==1)
14                 {
15                     x1=i;
16                     y1=j;
17                 }
18                 if(map[i][j]==2)
19                 {
20                     x2=i;y2=j;
21                 }
22             }
23         }
24         if(x1==x2&&y1==y2)
25             return 0;
26         int xt=x1<x2?1:-1;
27         int yt=y1<y2?1:-1;
28         vector<vector<int>>dp(n,vector<int>(m,1));
29         for(int i=x1+xt;i!=(x2+xt);i+=xt)
30         {
31             dp[i][y1]=map[i][y1]==-1?0:dp[i-xt][y1];
32         }
33         for(int j=y1+yt;j!=(y2+yt);j+=yt)
34         {
35             dp[x1][j]=map[x1][j]==-1?0:dp[x1][j-yt];
36         }
37         for(int i=x1+xt;i!=(x2+xt);i+=xt)
38        {
39             for(int j=y1+yt;j!=(y2+yt);j+=yt)
40             {
41                 dp[i][j]=map[i][j]==-1?0:dp[i-xt][j]+dp[i][j-yt];
42             }
43         }
44         return dp[x2][y2];
45     }
46 };

矩阵1

0   0   1   0    0

0  0    0   0    0

0  0    0   0    0

0  0    0   0    0

0  0    0   2    0

dp

0  0   1  1  1  0

0  0   1  0  0  0

0   0   1  0 0  0

0    0  1  0  0  0

0   0   1  0  0  0

dp[i][j]=dp[i-1][j]+dp[i][j-1]

0  0   1  1  1  0

0  0   1  2  3  0

0   0   1 3  6  0

0    0  1  4 10  0

0   0   1  5  15  0

时间: 2024-12-25 17:48:19

拜访-动态规划的相关文章

拜访问题:

现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址.给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径.保证矩阵的长宽都小于等于10. 测试样例: [[0,1,0],[2,0,0]],2,3 返回:2 思路:典型的动态规划题,以1在左上角,2在右上角为

动态规划经典问题--TSP问题

Travelling Salesman Problem 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值. 旅行商问题是图论中最著名的问题之一,即"已给一个n个点的完全图,每条边都有一个长度,求总长度最短的经过每个顶点正好一次的封

多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程

TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值.这篇文章解决的tsp问题的输入描述是: TSP问题的动态规划解法: 引用一下这篇文章,觉得作者把动态规划算法讲的非常明白:https://blog.csdn.ne

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

[动态规划] 黑客的攻击 Hacker&#39;s CrackDown Uva 11825

抽象为数学模型就是,  取尽可能多的互不相交的子集 ,  使得每一个子集都能覆盖全集 #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int n; int P[1000],cover[1000],f[1000]; int main(){ scanf("%d", &n); for (int i = 0; i < n;i++) {

Beauty Of algorithms(七)动态规划 钢条分割 矩阵链乘 最长公共子序列 最优二叉树

1.动态规划                动态规划的方法与方法类似,英文"dynamic programming",这里的programming不是程序的意思,而是一种表格法.都是通过组合子问题的解来解决原问题,分治方法将划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来求出原问题的解.与之相反动态规划应用于子问题的重叠情况,即不同的子问题具有公共的子问题,子问题的求解是递归进行 的,将其划分为更小的子问题,动态规划,每个子问题只求解一次,将其保存在表格中,从而无需每次求

Hdoj 1176 免费馅饼 【动态规划】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26110    Accepted Submission(s): 8905 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1