4899 記憶的輪廓

2021-08-01 19:38:09 字數 3287 閱讀 9753

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...