动态规划---街道问题(类似过河卒)
2017-10-29 20:22
1271 查看
一、问题描述
设有一个N*M(l≤ N≤50, l≤ M≤ 50)的街道。n和m表示横竖街道数。
规定行人从A(1,1)出发,在街道上只能向东或北方向行走。
N=3,M=3的街道图,从A出发到达B共有6条可供行走的路。
若在N*M的街道中,设置一个矩形障碍区域(包括围住该区域的街道和点)不让行人通行。
此矩形障碍区域用2对顶点坐标给出,前图中的2对顶点坐标为:(2,2),(8,4),此时从 A出发到达B的路径仅有两条。
程序要求:
任务一:给出N,M后,求出所有从A出发到达B的路径的条数。
任务二:给出N,M,同时再给出此街道中的矩形障碍区域的2对顶点坐标(X1,y1), (X2,Y2),然后求出此种情况下所有从A出发到达B的路径的条数。
如果答案太大,输出最后20位。
输入格式
第一行两个数n和m。
第二行为X1,Y1,X2,Y2.如果是任务一,则第二行为4个0.
输出格式
输出走路方案数。
样例输入
3 3
0 0 0 0
样例输出
6
样例输入
50 50
2 2 49 49
样例输出
2
数据规模和约定
1<=N,M<=50
解析:
求解从矩形左下角到右上角的方案数。
①我们发现,初始在(1,1)的位置,然后第一步走出的位置可以为:(1,2)、(2,1),其坐标之和为3
以此类推,第二步到达的点坐标之和为4,第三步到达的点坐标之和为5。。。
我们用f[i][j]表示从起点到达(i,j)的方案数,则有:f[i][j]=f[i-1][j]+f[i][j-1];
flag[i][j]表示(i,j)点能否通过。
于是得到递推式:
for(k=3;k<=n+m;k++)
for(i=1;i<=n;i++)
{
j=k-i;
f[i][j]=f[i-1][j]+f[i][j-1];
}
当然,还要保证上述的点都是有效的,能通过的。
②本题的第二个难点,结果可能很大,保留最后20位即可,但是最大的unsigned long long 也不过刚好20位,显然是存不下的。这个时候就只有用高精度了。
但是只要保存最后20位,所以直接假设ans是一个20位的整数,前10用d1来保存,后10位用d2来保存,这样只要在想家的过程中稍作处理即可,而不用真的去写一个高精度。
设有一个N*M(l≤ N≤50, l≤ M≤ 50)的街道。n和m表示横竖街道数。
规定行人从A(1,1)出发,在街道上只能向东或北方向行走。
N=3,M=3的街道图,从A出发到达B共有6条可供行走的路。
若在N*M的街道中,设置一个矩形障碍区域(包括围住该区域的街道和点)不让行人通行。
此矩形障碍区域用2对顶点坐标给出,前图中的2对顶点坐标为:(2,2),(8,4),此时从 A出发到达B的路径仅有两条。
程序要求:
任务一:给出N,M后,求出所有从A出发到达B的路径的条数。
任务二:给出N,M,同时再给出此街道中的矩形障碍区域的2对顶点坐标(X1,y1), (X2,Y2),然后求出此种情况下所有从A出发到达B的路径的条数。
如果答案太大,输出最后20位。
输入格式
第一行两个数n和m。
第二行为X1,Y1,X2,Y2.如果是任务一,则第二行为4个0.
输出格式
输出走路方案数。
样例输入
3 3
0 0 0 0
样例输出
6
样例输入
50 50
2 2 49 49
样例输出
2
数据规模和约定
1<=N,M<=50
解析:
求解从矩形左下角到右上角的方案数。
①我们发现,初始在(1,1)的位置,然后第一步走出的位置可以为:(1,2)、(2,1),其坐标之和为3
以此类推,第二步到达的点坐标之和为4,第三步到达的点坐标之和为5。。。
我们用f[i][j]表示从起点到达(i,j)的方案数,则有:f[i][j]=f[i-1][j]+f[i][j-1];
flag[i][j]表示(i,j)点能否通过。
于是得到递推式:
for(k=3;k<=n+m;k++)
for(i=1;i<=n;i++)
{
j=k-i;
f[i][j]=f[i-1][j]+f[i][j-1];
}
当然,还要保证上述的点都是有效的,能通过的。
②本题的第二个难点,结果可能很大,保留最后20位即可,但是最大的unsigned long long 也不过刚好20位,显然是存不下的。这个时候就只有用高精度了。
但是只要保存最后20位,所以直接假设ans是一个20位的整数,前10用d1来保存,后10位用d2来保存,这样只要在想家的过程中稍作处理即可,而不用真的去写一个高精度。
相关文章推荐
- leetcode 279. Perfect Squares 类似背包问题 + 很简单的动态规划DP解决
- leetcode 322. Coin Change 类似背包问题 + 很简单的动态规划DP解决
- 动态规划:编辑距离问题
- 动态规划之01背包问题(最易理解的讲解)
- 动态规划---0-1背包问题
- 动态规划的两个经典问题--01背包
- 《算法导论》之动态规划和贪心算法 0-1背包问题
- 动态规划第三讲——序列化的动态规划问题
- 动态规划5-矩阵连乘问题
- 动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法
- 动态规划经典题解--背包问题
- 从子集和问题的动态规划解看判断问题与优化问题的区别与联系
- uva 1380 - A Scheduling Problem 一个调度问题 好难的动态规划
- 双层动态规划_吃土豆问题
- 动态规划之01背包问题
- 动态规划-数塔路径之和最大值及路径输出问题
- C++实现算法导论十五章动态规划之钢条分割问题
- 动态规划解最长公共子序列问题
- 动态规划之背包问题
- 动态规划问题探究及其Java实现