4899: 記憶的輪廓
time limit: 5 sec memory limit: 512 mb
submit: 134 solved: 51
[submit][status][discuss]
description
通往賢者之塔的路上,有許多的危機。
我們可以把這個地形看做是一顆樹,根節點編號為1,目標節點編號為n,其中1-n的簡單路徑上,編號依次遞增,
在[1,n]中,一共有n個節點。我們把編號在[1,n]的叫做正確節點,[n+1,m]的叫做錯誤節點。乙個葉子,如果是正
確節點則為正確葉子,否則稱為錯誤葉子。莎緹拉要幫助昴到達賢者之塔,因此現在面臨著存檔位置設定的問題。
為了讓昴成長為英雄,因此一共只有p次存檔的機會,其中1和n必須存檔。被莎緹拉設定為要存檔的節點稱為存檔
位置。當然不能讓昴陷入死迴圈,所以存檔只能在正確節點上進行,而且同乙個節點不能存多次檔。因為通往賢者
之塔的路上有影響的瘴氣,因此莎緹拉假設昴每次位於樹上乙個節點時,都會等概率選擇乙個兒子走下去。每當走
到乙個錯誤葉子時,再走一步就會讀檔。具體的,每次昴到達乙個新的存檔位置,存檔點便會更新為這個位置(假
如現在的存檔點是i,現在走到了乙個存檔位置j>i,那麼存檔點便會更新為j)。讀檔的意思就是回到當前存檔點
。初始昴位於1,當昴走到正確節點n時,便結束了路程。莎緹拉想知道,最優情況下,昴結束路程的期望步數是多
少? input
第一行乙個正整數t表示資料組數。
接下來每組資料,首先讀入三個正整數n,m,p。
接下來m-n行,描述樹上所有的非正確邊(正確邊即連線兩個正確節點的邊)
用兩個正整數j,k表示j與k之間有一條連邊,j和k可以均為錯誤節點,也可以乙個為正確節點另乙個為錯誤節點。
資料保證j是k的父親。
50<=p<=n<=700,m<=1500,t<=5。
資料保證每個正確節點均有至少2個兒子,至多3個兒子。
output
t行每行乙個實數表示每組資料的答案。請保留四位小數。
sample input
3 7 2
1 42 5
3 63 7
sample output
9.0000
hint
source
by werkeytom_ftd
[submit][status][discuss]
orz棟爺爺的題題目剛放出來的那兩天曾經憑藉著玄學剪枝搞到了rk1
不過當時沒及時發表blog,於是現在排名都沒影了。。。。。
對於每乙個正確節點
i ,通過樹形dp
預處理這兩個東西 lc
[i] 代表如果從
i 走到
i的左兒子,從這棵子樹返回存檔點的期望步數
類似的也預處理rc
[i] (如果存在兩個兒子的話)
那麼就有乙個直觀的思路,定義f[
i][j
] 為第
j 個存檔點設在點
i,期望步數
轉移方程顯然f[
i][j
]=mi
n 其中d
is[i
][j]
為當i,
j 是兩個相鄰的存檔點的時候,從
i 走到
j的期望步數
假設現在需要計算di
s[i]
[j] ,那麼記xk
為從k 走到
j的期望步數
顯然有xk=
13(l
c[k]
+xi+
rc[k
]+xi
+xk+
1)+1
(假設有兩個兒子)
利用邊界條件xj
=0,就能從最後乙個式子往前代
反正用這個式子大力搞搞,o(
n2) 就能統計完di
s 陣列了
那麼這個dp
的原始複雜度是o(
n3) 的,還是do
uble
計算,似乎怎麼都過不去?
但是注意到p≥
50,n≤
700
隨便手算一下就能發現,當兩個存檔點距離大於
20 的時候,顯然是非常不優的
那就強制每
20 個點一定要有乙個存檔點,這樣dp
複雜度下降為o(
20n2)
當然這個
20 應該也是可以繼續往下壓壓的
於是就能跑得飛快啦~
好吧。。。現在這個榜。。。已經被各路神犇碾成狗了
#include
#include
#include
#include
#define min(a,b) ((a) < (b) ? (a) : (b))
using
namespace
std;
const
int g = 20;
const
int maxn = 707;
const
int maxm = 1505;
typedef
double db;
const db inf = 1e18;
const db _two = 1.00 / 2.00;
const db _three = 1.00 / 3.00;
int n,m,p,t;
db f[maxn][maxn],g[maxm],a[maxn],b[maxn],dis[maxn][maxn];
vector
v[maxm];
inline
int getint()
inline
void dfs(int x)
if (sz > 0) g[x] /= sz; g[x] += 1.00;
}void solve()
dfs(1);
for (int i = 1; i < n; i++)
a[i] /= sz; b[i] /= sz; b[i] += 1.00;
}for (int i = 1; i < n; i++)
}for (int i = 2; i <= n; i++)
}printf("%.4lf\n",f[n][p]);
}void clear()
int main()
OpenCV中的輪廓發現和輪廓繪製
實現 import cv2 import numpy as np 輪廓發現和輪廓繪製 img是一張與binary類似的二值圖,contours是list列表結構每個元素包含乙個邊沿資訊,heriachy是乙個矩陣,用處作者也未知,可以 contours,heriachy cv2.findcontou...
關於輪廓的各種使用
include cv.h include highgui.h include cvaux.h include cxcore.h include include using namespace std using namespace cv define pi 3.14159f void drawbox...
OpenCV 輪廓的凸性
一 概括 理解物體形狀或輪廓的另外一種有用的方法是計算乙個物體的凸包 convex hull 然後計算其凸缺陷 convexity defects 很多複雜物體的特性能很好的被這種缺陷表現出來。二 相關函式 1 發現點集的凸外形 cvseq cvconvexhull2 const cvarr inp...