二维动态规划。和某一道leetcode的题目差不多。就是多了blocks的数组或集合。

本次解题的心得有:1.根据题意使用集合表示阻碍;2.使用字符串的形式表示整数的pair,简洁明了;3.p1到p2的阻碍其实是双向的;4.可以不用首行首列的全0;5.mx[i][j]和mx[i-1][j]和mx[i-1][j]可以分别加的。

import java.util.*;

public class AvoidRoads
{
public long numWays(int width, int height, String[] bad) {
HashMap<String,HashSet<String>> blocks = new HashMap<String,HashSet<String>>();
for (String badStr : bad) {
String[] bl = badStr.split(" ");
int x1 = Integer.parseInt(bl[0]);
int y1 = Integer.parseInt(bl[1]);
int x2 = Integer.parseInt(bl[2]);
int y2 = Integer.parseInt(bl[3]);
String p1 = "" + x1+ ":" + y1;
String p2 = "" + x2 + ":" + y2;
// p1 -> p2 && p2-> p1 are blocked
if (!blocks.containsKey(p1)) {
HashSet<String> set = new HashSet<String>();
blocks.put(p1, set);
}
if (!blocks.containsKey(p2)) {
HashSet<String> set = new HashSet<String>();
blocks.put(p2, set);
}
blocks.get(p1).add(p2);
blocks.get(p2).add(p1);
}
long mx[][] = new long[width+1][height+1]; for (int i = 0; i < width+1; i++) {
for (int j = 0; j < height+1; j++) {
if (i == 0 && j == 0) {
mx[i][j] = 1;
}
else {
String s0 = ""+i+":"+j;
String s1 = ""+(i-1)+":"+j;
String s2 = ""+i+":"+(j-1);
if (i > 0 && !(blocks.containsKey(s1) && blocks.get(s1).contains(s0))) {
mx[i][j] += mx[i-1][j];
}
if (j > 0 && !(blocks.containsKey(s2) && blocks.get(s2).contains(s0))) {
mx[i][j] += mx[i][j-1];
}
}
}
}
return mx[width][height];
}
}

  

[topcoder]AvoidRoads的更多相关文章

  1. [Topcoder]AvoidRoads(dp,hash)

    题目连接:https://community.topcoder.com/stat?c=problem_statement&pm=1889&rd=4709 题意:给一张n*m的地图,上面 ...

  2. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  3. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  4. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  5. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  6. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  7. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  8. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  9. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

随机推荐

  1. String str 与 String str=new String("") 区别

    1.当使用String str="abc",这种方式时,先去内存的Heap中找是否存在"abc"这个字符串,若存在,则将地址引用.若不存在则创建. 2.当使用S ...

  2. c#基础学习汇总----------继承

    封装,继承,多态.这是面向对象的思想,也可以说是最基本的东西.说到继承,直接的说他就是面向对象中类与类之间的一种关系.通过继承,使得子类具有父类公有的受保护访问权限的属性和方法,同时子类可以通过加入新 ...

  3. 为mapcontrol中的图层设置透明度

    ILayer pLayer = axMapControl1.get_Layer(); ILayerEffects pLayerEffects = (ILayerEffects)pLayer; pLay ...

  4. CAF(C++ actor framework)使用随笔(同步发送 异步与同步等待)(三)

    c). 同步发送, 等待响应, 超时后收到1个系统消息. 贴上代码 #include <iostream> #include "caf/all.hpp" #includ ...

  5. linux 硬盘相关命令学习

    summary: 查看硬盘信息:几块硬盘,品牌,容量 查看分区信息 参考资料: Linux下查看磁盘分区命令详解: http://blog.chinaunix.net/uid-26119273-id- ...

  6. MySQL学习笔记之数据存储类型

    说明:本文是作者对MySQL数据库数据存储类型的小小总结. Numeric Type (数字类型) 1.TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT主要根据存储字节长度不 ...

  7. L007-oldboy-mysql-dba-lesson07

    L007-oldboy-mysql-dba-lesson07 [root@web01 ~]# mysqldump -uroot -ptestpassword -A >/root/mysql_ba ...

  8. input获取永久焦点

    $(function () { $('#test').blur(function () { var that = this; //或者用闭包 setTimeout(function () { $(th ...

  9. BroadcastReceiver

    BroadcastReceiver 广播接受者 Android中, Broadcast是一种数据传递的方式/通信方式. Brodadcast 是Android 系统组件之一 广播的特性 1. 由一个发 ...

  10. Python Generators vs Iterators

    http://stackoverflow.com/questions/2776829/difference-between-python-generators-vs-iterators iterato ...