topcoder srm 425 div1
problem1 link
暴力搜索即可。
problem2 link
可以将每次所有的piece的位置看作一个状态,由于$C_{25}^{5}=53130$,所以最多有这么多状态。这里可以加一些优化来减少状态。比如通过旋转或者翻转是一样的状态其结果是一样的。
然后进行bfs即可。
problem3 link
对于一个状态$mask$来说,可以将其分成两个子状态$S_{1},S_{2}=mask-S_{1}$.为了防止重复,可以令两个固定的点$u_{1} \in S_{1},v_{1} \in S_{2}$.
$S_{1}={u_{1},u_{2},...,u_{n}}$
$S_{2}={v_{1},v_{2},...,v_{m}}$
那么$f[mask]=f[S_{1}]*f[S_{2}]*X*Y$
$X=\sum_{i=1}^{m}(p_{u_{1},v_{i}}*\sum_{x \in{S2-v_{i}}}(1-p_{u_{1},x}))$
$Y=\prod_{i=2}^{n}\prod _{x\in S_{2}}(1-p_{u_{i},x})$
code for ploblem1
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class CrazyBot { boolean[][] f=null;
double[] p=new double[4];
final int[] dx={0,0,-1,1};
final int[] dy={1,-1,0,0};
double result=0.0;
int n; public double getProbability(int n, int east, int west, int south, int north) {
this.n=n;
f=new boolean[2*n+1][2*n+1];
p[0]=east/100.0;
p[1]=west/100.0;
p[2]=south/100.0;
p[3]=north/100.0;
dfs(n,n,0,1.0);
return result;
} void dfs(int x,int y,int step,double prob) {
if(step==n) {
result+=prob;
return;
}
f[x][y]=true;
for(int i=0;i<4;++i) {
int xx=x+dx[i];
int yy=y+dy[i];
if(!f[xx][yy]) {
dfs(xx,yy,step+1,prob*p[i]);
}
}
f[x][y]=false;
}
}
code for ploblem2
import com.sun.org.apache.xpath.internal.operations.Bool; import java.net.Inet4Address;
import java.util.*;
import java.math.*;
import java.util.regex.Pattern; import static java.lang.Math.*; public class PiecesMover { static class Pair {
public int x;
public int y; public Pair() {}
public Pair(int x,int y){
this.x=x;
this.y=y;
}
} int index(int x,int y) {
return x*5+y;
}
int index(Pair p) {
return p.x*5+p.y;
}
Pair revIndex(int t) {
return new Pair(t/5,t%5);
} Map<Integer,Integer> map=new HashMap<>();
Map<Integer,Integer> map1=new HashMap<>();
List<Integer> map2=new ArrayList<>();
List<Boolean> stopStatus=new ArrayList<>();
int n=0;
public int getMinimumMoves(String[] board) {
int startMask=0;
for(int i=0;i<5;++i) {
for(int j=0;j<5;++j) {
if(board[i].charAt(j)=='*') {
startMask|=1<<index(i,j);
++n;
}
}
}
if(n==1) {
return 0;
} Pair[] all=new Pair[n];
for(int i=0;i<n;++i) {
all[i]=new Pair();
}
dfs(0,0,0,0,all); return bfs(startMask);
} int bfs(int startMask) {
int[] f=new int[map2.size()];
boolean[] inq=new boolean[map2.size()];
for(int i=0;i<f.length;++i) {
f[i]=-1;
} startMask=map.get(startMask);
Queue<Integer> queue=new LinkedList<>();
int id=map1.get(startMask);
queue.offer(id);
f[id]=0;
inq[id]=true;
int result=1<<20; final int[] dx={0,0,1,-1};
final int[] dy={1,-1,0,0}; while(!queue.isEmpty()) {
final int u=queue.poll();
inq[u]=false;
if(stopStatus.get(u)) {
result=Math.min(result,f[u]);
continue;
}
final int mask=map2.get(u);
for(int i=0,num=0;i<25&&num<n;++i) {
if((mask&(1<<i))==0) {
continue;
}
++num;
final int xx=revIndex(i).x;
final int yy=revIndex(i).y;
for(int d=0;d<4;++d) {
final int nx=xx+dx[d];
final int ny=yy+dy[d];
if(nx<0||nx>=5||ny<0||ny>=5||(mask&(1<<index(nx,ny)))!=0) {
continue;
}
final int nMask=map.get(mask^(1<<i)|(1<<index(nx,ny)));
final int v=map1.get(nMask);
if(f[v]==-1||f[u]+1<f[v]) {
f[v]=f[u]+1;
if(!inq[v]) {
inq[v]=true;
queue.offer(v);
}
}
}
}
}
return result;
} void dfs(int x,int y,int id,int mask,Pair[] all) {
if(id==n) {
deal(mask,all);
return;
}
if(y==5) {
y=0;
++x;
}
if(x==5) {
return;
}
all[id].x=x;
all[id].y=y;
dfs(x,y+1,id+1,mask|1<<index(x,y),all);
dfs(x,y+1,id,mask,all);
} int getMaks(Pair[] p) {
int mask=0;
for(int i=0;i<p.length;++i) {
mask|=1<<index(p[i]);
}
return mask;
} void deal(int mask,Pair[] all) {
if(map.containsKey(mask)) {
return;
}
int[] tMask=new int[6];
tMask[0]=reverseX(all);
tMask[1]=reverseY(all);
for(int i=0;i<4;++i) {
all=rotate(all);
tMask[i+2]=getMaks(all);
}
int minMask=tMask[0];
for(int i=1;i<6;++i) {
minMask=Math.min(minMask,tMask[i]);
}
map1.put(minMask,map2.size());
for(int i=0;i<6;++i) {
map.put(tMask[i],minMask);
}
map2.add(minMask);
stopStatus.add(isStopStatus(all));
} boolean isStopStatus(Pair[] all) { int t=1;
List<Integer> list=new ArrayList<>();
list.add(0);
while(list.size()>0) {
List<Integer> list1=new ArrayList<>();
for(int i=0;i<all.length;++i) {
if((t&(1<<i))!=0) {
continue;
}
for(int j=0;j<list.size();++j) {
if(isAdj(all[i],all[list.get(j)])) {
list1.add(i);
t|=1<<i;
break;
}
}
}
list=list1;
}
return t==((1<<all.length)-1);
} boolean isAdj(Pair a,Pair b) {
if(a.x==b.x) {
return Math.abs(a.y-b.y)<=1;
}
if(b.y==a.y) {
return Math.abs(a.x-b.x)<=1;
}
return false;
} int reverseX(Pair[] all) {
int mask=0;
for(int i=0;i<all.length;++i) {
mask|=1<<index(all[i].x,4-all[i].y);
}
return mask;
}
int reverseY(Pair[] all) {
int mask=0;
for(int i=0;i<all.length;++i) {
mask|=1<<index(4-all[i].x,all[i].y);
}
return mask;
}
Pair[] rotate(Pair[] all) {
for(int i=0;i<all.length;++i) {
int x=all[i].x;
int y=all[i].y;
all[i].x=4-y;
all[i].y=x;
}
return all;
}
}
code for ploblem3
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class RoadsOfKingdom { double[][] prob=null;
int n; double[][] f1=null;
double[][] f2=null;
boolean[] visited=null;
double[] dp=null; public double getProbability(String[] roads) {
n=roads.length;
prob=new double[n][n];
for(int i=0;i<n;++i) {
for(int j=0;j<n;++j) {
prob[i][j]=(roads[i].charAt(j)-'0')/8.0;
}
}
f1=new double[1<<n][n];
f2=new double[1<<n][n];
for(int i=0;i<(1<<n);++i) {
for(int j=0;j<n;++j) {
f1[i][j]=1;
f2[i][j]=0;
for(int k=0;k<n;++k) {
if((i&(1<<k))!=0) {
f1[i][j]*=1-prob[k][j];
f2[i][j]+=f1[i^(1<<k)][j]*prob[j][k];
}
}
}
}
visited=new boolean[1<<n];
dp=new double[1<<n];
return dfs((1<<n)-1);
}
double dfs(int mask) {
if(visited[mask]) {
return dp[mask];
}
int p1=-1,p2=-1;
for(int i=0;i<n;++i) {
if((mask&(1<<i))!=0) {
if(p1==-1) {
p1=i;
}
else if(p2==-1) {
p2=i;
break;
}
}
}
if(p2==-1) {
return 1;
}
final int S=mask^(1<<p1)^(1<<p2);
double result=0;
for(int sub=S;;sub=(sub-1)&S) { final int S1=sub|1<<p1;
final int S2=mask^S1; double x=1;
for(int i=0;i<n;++i) {
if(i!=p1&&(S1&(1<<i))!=0) {
x*=f1[S2][i];
}
}
result+=dfs(S1)*dfs(S2)*f2[S2][p1]*x; if(0==sub) {
break;
}
}
visited[mask]=true;
return dp[mask]=result;
}
}
topcoder srm 425 div1的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- topcoder srm 575 div1
problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...
随机推荐
- npm 安装React Devtools调试工具
有时候没有***工具时,怎么安装React DevTool, 其一直接搜索到Chrome的插件安装即可. 其二, 可以通过下载github上的react-devtools, 然后打包,最后导入chro ...
- VS 星期作业 if else的应用 做一个受不受异性欢迎的小程序
static void Main(string[] args) { //漏掉代码 输入错误 进行提示! string T1, T2, T3, T4, T5, T6, T7, T8, T9, T10=& ...
- 第一章 JS基础
1.JavaScript的作用:表单验证,减轻服务器压力动态效果动态改变页面内容 2.JavaScript的组成ECMAScript语法规定BOM对象模型(浏览器对象模型)DOM对象模型(文档对象模型 ...
- Shader2.0常用语义
POSITION: 获取模型顶点的信息.NORMAL: 获取法线信息TEXCOORD(n): 高精度的从顶点传递信息到片段着色器COLOR: 表示低精度从顶点传递信息到片段着色器 ...
- 大数据处理框架之Strom:redis storm 整合
storm 引入redis ,主要是使用redis缓存库暂存storm的计算结果,然后redis供其他应用调用取出数据. 新建maven工程 pom.xml <project xmlns=&qu ...
- python 怎么让list里面设置NAN numpy.nan
- 普通程序员转型AI免费教程整合,零基础也可自学
普通程序员转型AI免费教程整合,零基础也可自学 本文告诉通过什么样的顺序进行学习以及在哪儿可以找到他们.可以通过自学的方式掌握机器学习科学家的基础技能,并在论文.工作甚至日常生活中快速应用. 可以先看 ...
- doc&Alt+/ 快捷键设置&ThreadLocal Fameset与Frame区别
Alt+/不管用原因:新版本中MyEclipse的Alt+/是别的快捷键,Ctrl+Space是提示标签快捷键,而Ctrl+Space与输入法切换冲突不能用.MyEclipse设置Alt+/快捷键 1 ...
- linux 二级域名设置
首先,你的拥有一个有泛域名解析的顶级域名,例如: domain.com 其次,在 httpd.conf 中打开 mod_rewrite 之后,在 httpd.conf 的最后,添加以下内容: Rewr ...
- echart中间显示固定的字