先计算各个独立事件1件事情、2件事情、3件事情直到N件事情的概率,
let eachP = [1/4,1/2,1/2]
function getE(eachP){
let res = 0 , n = eachP.length
function getZuHe(m){
let used = [] , all = []
function dfs(path,index){
if(path.length === m){
all.push(path.slice())
return;
}
for(let i = index ; i < n ; i ++){
if(used[i]) continue;
path.push(i)
used[i] = true
dfs(path,i)
path.pop()
used[i] = false
}
}
dfs([],0)
return all
}
function getP (m){ //传入的参数表示发生m件事情的概率
let eachE = 0
//n个里面m个的组合
if(m === 0){
for(let i = 0 ; i < eachP.length ; i++){
eachE *= (1 - eachP[i])
}
return eachE
}
let zuhe = getZuHe(m) ;
// console.log(getZuHe(m))
let eachPIndexArr = [];
for(let i = 0 ; i < n ; i ++){
eachPIndexArr.push(i)
}
for(let i = 0 ; i < zuhe.length ; i ++){
// console.log(zuhe[i])
let eachNumP = 1 , eachZuHe = zuhe[i]
for(let j = 0 ; j < eachZuHe.length ; j ++){
// console.log('you:',eachP[j]) //注意下标
// console.log('you:',eachP[eachZuHe[j]])
eachNumP *= eachP[eachZuHe[j]]
}
//如何快速比较 zuhe 和 p ,得到zuhe中不存在的数,
//数字有重复,所以比较下标
const numLeft = eachPIndexArr.filter(item => !eachZuHe.includes(item))
for(let k = 0 ; k < numLeft.length ; k ++){
// console.log('meiyou:',1-eachP[numLeft[k]])
eachNumP *= (1-eachP[numLeft[k]])
}
// console.log(eachNumP)
eachE += eachNumP
}
// console.log(eachE)
return eachE
}
for(let i = 0 ; i <= n ; i ++){
// console.log(i * getP (i))
res += i * getP (i)
}
// console.log(1 * getP (1))
console.log(res)
// getP(1)
}
getE(eachP)
遇到的主要问题
n个里面m个的组合 -dfs
如何快速比较两个数组zuhe和p,得到zuhe中不存在的数 - 用.filter()方法,数字是有重复的,所以我用的下标比较。
还有就是当时数组太多,循环遍历使用的时候没有更新为最新数组加下标,而是只写了下标之类的犯错查找问题,检查结果才发现。
快速得到'Z'的ASCII值
c++ 里面可以 'Z'-'A' js
console.log('Z'-'A') //NaN
.charCodeAt()
console.log('Z'.charCodeAt());
有机会用一下bfs
//无向图
//只能跨国一次
//目前求得最短路径和
function func(input){
let inputArray = input;
let n = parseInt(inputArray[0]),m = parseInt(inputArray[1]),aroad = [],broad=[]
let ipt3 = inputArray[2]
for(let i = 1 ; i <= ipt3.length ; i ++){
if(ipt3[i-1] != 'B'){
aroad.push(i)
}else broad.push(i)
}
// console.log(aroad)
// console.log(broad.includes(1))
let adj = []
let data = Array.from({length:n+1}).map(()=>Array(n+1)) , cArr = Array.from({length:n+1}).map(()=>Array(n+1))
//console.log(data)
for(let i = 3 ; i <inputArray.length ; i ++){
let line = inputArray[i].split(' ')
let one = parseInt(line[0]) , two = parseInt(line[1]) , distance = parseInt(line[2]) , cost = parseInt(line[3])
if(adj[one]) adj[one].push(two)
else adj[one] = [two]
if(adj[two]) adj[two].push(one)
else adj[two] = [one]
// console.log(one,two,distance)
data[one][two] = distance
data[two][one] = distance
cArr[two][one] = cost
cArr[one][two] = cost
}
let resd = Infinity ,resc = Infinity
let used = [1] , flag = 0 //默认还没跨国
let curDistance = 0
function dfs(curIndex,path){
if(curIndex == n){
console.log(path,curDistance)
resd = Math.min(resd,curDistance)
return;
}
for(let i = 0 ; i < adj[curIndex].length ; i ++){
let from = curIndex , to = adj[curIndex][i]
if(used[to] ) continue;
console.log(flag)
if(aroad.includes(from) && broad.includes(to) || aroad.includes(to) && broad.includes(from)) {
flag ++
}
if(flag > 2) continue;
path.push(to)
used[to] = true
curDistance += data[from][to]
dfs(to,path)
used[to] = false
path.pop()
curDistance -= data[from][to]
if(aroad.includes(from) && broad.includes(to) || aroad.includes(to) && broad.includes(from)) {
flag --
}
}
}
dfs(1,[1])
console.log(resd)
};
let ipt = [
'5',
'5',
'AABBB',
'1 3 200 1',
'2 3 150 3',
'3 4 170 1',
'4 5 170 2',
'2 5 160 1'
]
func(ipt)