VIJOS基礎動態規劃試題泛做 I

2021-07-26 09:36:29 字數 1604 閱讀 3548

一大波水題正在來襲

一道卡精度的坑爹題

做法很裸。我們將此題看作一道類似於方格取數的雙程序的dp。容易考慮到,如果由(i,j)跳至(i,j+2),那麼未跳的那個程序必須經過(j+1,x),否則不滿足定義。我們通過這個性質定義一部分的方程。同時,通過這個方法,我們可以保證,1~min(i,j)這一段一定已經取得最小值,而對於乙個最優化的路徑,一定滿足這個情況,也就是我們找到了乙個最優子結構。

#include 

#include

#include

#include

#include

using

namespace

std;

#define x first

#define y second

double dis[1001][1001];

pair < double , double > p[1001];

double dp[1001][1001]; //表示每次到了哪兩個點

int n;

double eucdis( int a , int b )

int main()

noip2001

組合計數的經典例題。我們定義狀態為dp[i][j],其中第一維是當前的數字的數值,第二維是加了多少個符號。那麼有兩種可能,即:沒有任何劃分部分為一,此時的可能數等於dp[i-j][j],可以形象的看作為i-j劃分為的方案數等於i劃分為。如果有任意部分為一,那麼無論它是否還有一,dp[i-1][j-1]為此時的可能性。對此求和即可。

#include 

#include

using

namespace

std;

int n,k;

int dp[201][7];

int main()

一道字首和相關題,不知道為什麼分類在dp下。

做法很簡明。我們定義 dp

[i][

j]為以 (i

,j) 為矩形右下頂點的座標。如果這點可以蓋房子,那麼我們只需要討論: 1、d

p[i−

1][j

−1] 外推到dp

[i][

j],即直接以原情況外推。 2、d

p[i]

[j−1

] 與dp

[i−1

][j−

1]二者較小的那個(因為瑕疵可能並不是包括在兩個矩形共同覆蓋的區域裡的)。

那麼方程易推得。這道題其實並不需要存地圖,然而存了也無所謂。

#include 

#include

#define min(a,b) ((a)<(b)?a:b)

#define max(a,b) ((a)<(b)?b:a)

intmap[1001][1001],f[1001][1001];

int main()

vijos1011 動態規劃

include include include include using namespace std define forn i,n for int i 0 i n i define for1 i,n for int i 1 i n i int a 505 505 int map 505 505 ...

vijos1476 旅遊規劃 動態規劃

傳送門 題解 我是這麼做的,首先第一遍求出每個點向下的不相交的最長鏈和次長鏈,這樣兩條鏈拼起來就是就是過這個點 不包含他的父親的情況下 的最長鏈。在這些最長鏈中取max就可以得到直徑。然後乙個點在直徑上,要麼他本身就在已經求出的最長鏈上 就是從這個點出發的最長 次長鏈 直徑長度 要麼如果這個點在某一...

vijos1441 打鼴鼠 (動態規劃)

p1441打鼴鼠 accepted 標籤 動態規劃 cscii 鼴鼠是一種很喜歡挖洞的動物,但每過一定的時間,它還是喜歡把頭探出到地面上來透透氣的。根據這個特點阿q編寫了乙個打鼴鼠的遊戲 在乙個n n的網格中,在某些時刻鼴鼠會在某乙個網格探出頭來透透氣。你可以控制乙個機械人來打鼴鼠,如果i時刻鼴鼠在...