【动态规划中级】AvoidRoads
2014-05-21 16:12
246 查看
|
从图中可以看出,如果边可达,那么到达roadnum[0][i]=1; roadnum[i][0]=1;到达黄点的路径条数,roadnum[1][1]=roadnum[0][1]+roadnum[1][0]
依次类推,roadnum[i][j]=到达roadnum[i-1][j]和到达road[i][j-1]的路径之和。
#include<stdio.h> #include<iostream> using namespace std; #define LEN 100 int bad[LEN][4]; int badn; long long roadnum[LEN][LEN]; int reachable(int x1,int y1,int x2,int y2){ for(int i=0;i<badn;i++){ if( (x1==bad[i][0]&& y1==bad[i][1]&& x2==bad[i][2] && y2== bad[i][3]) || (x1==bad[i][2]&& y1==bad[i][3]&& x2==bad[i][0]&& y2==bad[i][1]) ) return 0; } return 1; } long long dp(int m,int n){ for(int i=0;i<=m;i++){ roadnum[i][0]=0; if(reachable(i,0,i-1,0)&& (i>1&&roadnum[i-1][0]>0 || i==1) )roadnum[i][0]=1; } for(int i=0;i<=n;i++){ roadnum[0][i]=0; if(reachable(0,i,0,i-1)&& (i>1&&roadnum[0][i-1]>0 || i==1) )roadnum[0][i]=1; } for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ roadnum[i][j]=0; if(reachable(i,j,i-1,j)) roadnum[i][j]+=roadnum[i-1][j]; if(reachable(i,j,i,j-1)) roadnum[i][j]+=roadnum[i][j-1]; } } return roadnum[m] ; } int main(){ freopen("in.txt","r",stdin); int m,n; while(cin>>m>>n){ cin>>badn; for(int i=0;i<badn;i++){ for(int j=0;j<4;j++){ cin>>bad[i][j]; } } cout<<dp(m,n)<<endl; } }
测试用例:6 620 0 0 16 6 5 61 1035 3102 230 0 1 01 2 2 21 1 2 1
结果:252264064843918665349760
------------------------------------------------------------------------------------------------------------网易公开课脑筋急转弯第八课路径计算 http://v.163.com/movie/2011/8/7/C/M95DFI4U4_M95PIUK7C.html第九课三维路径计算 http://v.163.com/movie/2011/8/T/R/M95DFI4U4_M95PJ6FTR.html
这类矩阵的问题要想着先处理边。正如视频中所讲的那样
→
↓
拓展多项式求(x+y)n=?如(x+y)4=1x4 + 4x3y + 6x2y2 + 4xy3 + 1y4
可以看出系数就是紫色的对应的部分。拆开相乘就知道譬如x2y2是由6种途径得到的,和图中所展示的一样,到达x2y2有六种途径。很奇妙!
三维见视频。总结:
--------------------------------------------------------------------------------------------------------------
来自为知笔记(Wiz)
相关文章推荐
- 动态规划 中级题解 路径记录
- 动态规划中级教程(leetcode)152.Maximum Product Subarray
- 动态规划中级教程 646. Maximum Length of Pair Chain
- 动态规划中级教程 279. Perfect Squares
- 动态规划中级教程300.Longest Increasing Subsequence
- 动态规划中级教程 322. Coin Change
- 动态规划中级教程 343. Integer Break
- 动态规划中级教程 377. Combination Sum IV
- 中级动态规划训练(1)
- 破解文件夹加密大师的中级磁盘保护
- 动态规划-Number String
- 动态规划-背包问题(状态转换)
- 数塔 动态规划
- hdu 1114 Piggy-Bank 动态规划+完全背包
- HUD2084 数塔 -- 动态规划
- 动态规划求解最长公共子串
- XOR Segment (动态规划||苏州大学计算机学院三月月赛暨蓝桥杯热身赛)
- OpenJudge百炼-1191-棋盘分割-C语言-动态规划
- nyoj 236心急的C小加 动态规划( java)
- 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割