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的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. 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)其 ...

随机推荐

  1. C\C++程序结束另外的进程

    WinExec("taskkill /f /im center_flextrbo.exe",SW_HIDE);

  2. 15. 3Sum(字典)

    Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...

  3. Rpgmakermv(7) Chronus.js说明与简要翻译

    插件地址:https://github.com/triacontane/RPGMakerMV/blob/master/Chronus.js 日语版 ゲーム内で時刻と天候の概念を表現できるプラグインです ...

  4. 未能正确加载“EditorPackage”包(转)

    打开vs2012加载项目的时候报如下的错误: 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包.此问题可能是由配置 ...

  5. 【Hadoop学习之一】Hadoop介绍

    一.概念 Hadoop是一个能够对大量数据进行分布式处理的软件框架,充分利用集群的威力进行高速运算和存储. 二.主要模块Hadoop Common:支持其他Hadoop模块的常用实用程序.Hadoop ...

  6. mouseTracking

    [1]mouseTracking 追踪鼠标的标志位 作用:保存窗口部件默认是否接收鼠标移动事件.此成员变量在QWidget类中. [2]Qt Assistant 解释 翻译如下: 这个属性保存部件窗口 ...

  7. rabbitmq和redis用作消息队列的区别

    将redis发布订阅模式用做消息队列和rabbitmq的区别: 可靠性redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中:r ...

  8. 【转】ETL讲解(很详细!!!)

    ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要的一个环节. 通常情况下,在 ...

  9. JXNU暑期选拔赛

    最小的数 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submissi ...

  10. 洛谷 P1106 删数问题

    一定要认真审题   “去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数”   也就是说 输入:7893400   4     输出:300  (00在原顺序中位于3后边) 输入:789 ...