[topcoder]ActivateGame
http://community.topcoder.com/stat?c=problem_statement&pm=10750&rd=14153
http://apps.topcoder.com/wiki/display/tc/SRM+470
因为是棋盘型,然后就想到棋盘型DP;觉得不行,就想到BFS/DFS(这时其实已经把这个看成一张图了)。发现,寻找下一个节点进来的时候,总是要全局考虑所有已经Activate的点,BFS/DFS未果。此时感觉有点像最小生成树的Prim算法,用贪心的,但不知如何证明。此时看了一下题解,发现果然可以规约成最小生成树。因为本质是把棋盘看成一棵树后,整个过程就是Prim的过程。Kruskal的复杂度是O(e*loge),适合求稀疏的图,Prim的复杂度是O(n*n),与边无关,适合求稠密的图。(注:Prim使用堆优化效率可更高。)
Prim算法的讲解:http://www.nocow.cn/index.php/Prim%E7%AE%97%E6%B3%95
参考答案的实现也是O(n*n)的,n为w*h。虽然实现方法和纯粹用邻接表表示的有不同(因为具体问题),但效率并无退化。
我在实现错误的将四个方向的组合从(1,0)这样的搞成了(1,-1)。这表示用两个数组,然后循环遍历,也很简洁。其实里面的变量可以命名为row, col等。
int[] r = new int[] {0, 1, 0, -1};
int[] v = new int[] {1, 0, -1, 0};
代码:
import java.math.*;
public class ActivateGame
{
public int findMaxScore(String[] grid)
{
int h = grid.length;
int w = grid[0].length();
boolean[][] activated = new boolean[h][w];
activated[0][0] = true;
int[] r = new int[] {0, 1, 0, -1};
int[] v = new int[] {1, 0, -1, 0};
int sum = 0;
for (int cnt = 1; cnt < h*w; cnt++)
{
int max = 0;
int ar = 0;
int av = 0;
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
{
if (activated[i][j])
{
for (int x = 0; x < 4; x++)
{
if (isValid(i+r[x], j+v[x], h, w) && !activated[i+r[x]][j+v[x]])
{
int score = Math.abs(getScore(grid[i].charAt(j))-
getScore(grid[i+r[x]].charAt(j+v[x])));
if (score > max)
{
max = score;
ar = i+r[x];
av = j+v[x];
}
}
}
}
}
sum += max;
activated[ar][av] = true;
}
return sum;
}
private int getScore(char c)
{
if (c >= '0' && c <= '9')
{
return c - '0';
}
else if (c >= 'a' && c <= 'z')
{
return c - 'a' + 10;
}
else if (c >= 'A' && c <= 'Z')
{
return c - 'A' + 36;
}
return 0;
}
private boolean isValid(int x, int y, int h, int w)
{
return (x >=0 && x< h && y>=0 && y < w);
}
}
[topcoder]ActivateGame的更多相关文章
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- Topcoder几例C++字符串应用
本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...
- TopCoder
在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- TopCoder SRM 590
第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement Fox Ciel is going to play Gomoku with her friend ...
- Topcoder Arena插件配置和训练指南
一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...
随机推荐
- 练习题之ThreadLocal
public class ThreadLocalMain { private static ThreadLocal<Integer> value = new ThreadLocal< ...
- SQL 有父标识的 递归查询
递归查询,临时表的高级应用 WITH temp AS ( --父项 SELECT * FROM Ar_Area WHERE Ar_Parent = UNION ALL --递归结果集中的下级 SELE ...
- ASC码 .
有些时候需要用到一些字符的ASC码,到网上查找太麻烦,现在记录下来. 第128-255号为扩展字符(不常用) Dec Hx Oct Char Dec Hx Oct Char Dec Hx Oct ...
- selenium IDE处理各种窗口问题解决方法
一.处理模态窗口:showModalDialog 由于弹出模态窗口后,就无法定位到当前窗口的元素和模态窗口的元素,需要添加js解决 模态窗口动作类似下面语句: <input id="c ...
- CSS当中color的四种表示方法
这是我的第一篇博客,所以写的东西会比较简单. css当中,好多地方都会用到color属性,用来使html内容丰富多彩,例如:background-color:border-color: 第一种表示法使 ...
- ObjectQuery查询及方法
ObjectQuery 类支持对 实体数据模型 (EDM) 执行 LINQ to Entities 和 Entity SQL 查询.ObjectQuery 还实现了一组查询生成器方法,这些方法可用于按 ...
- iframe 的基本操作
要在服务器环境下才行 1.iframe 下操作父页面window.parent.document.getElementById //全部支持window.top //最顶层ie 下的iframe的on ...
- ci 多个文件同时上传
// 单个文件请手册,这里多个文件中,参数设置可参考手册 view 视图 <form...> <input type="file" name="user ...
- [C#]async/Await 使用小计
如果指定使用 异步 或 异步 修饰符,方法是异步方法,可以实现以下两个函数. • 清单异步方法可以使用 Await 或指定的 等待 悬挂点. 等待运算符通知编译器异步方法不能继续点的过去,直到等待 ...
- [C#]『CountdownEvent』任务并行库使用小计
System.Threading.CountdownEvent 是一个同步基元,它在收到一定次数的信号之后,将会解除对其等待线程的锁定. CountdownEvent 专门用于以下情况:您必须使用 ...