2021 2 17 DP測試總結

2021-10-19 12:00:37 字數 3754 閱讀 5233

考試總結

晚上打了場cf,早上有點瞌睡,狀態不太好。

t1 音量調節

12年河南省選題,洛谷難度普及–,我覺著還好,看出來是dp,但沒想到後面都是dp,這道題我的思路就是用乙個f[i][[j]去進行乙個可行性的計算,從大的往小的,從後往前,如果f[i-1][j+a[i]]或f[i-1][j-a[i]滿足條件,就對f[i][j]進行更新,最後的話從大到小把f[n][i]掃瞄一下,找到最大的值,直接輸出,結束程式。

題目和**如下

題目描述音量用乙個整數描述。輸入檔案中給定整數beginlevelbeginlevel,代表吉他剛開始的音量,以及整數maxlevelmaxlevel,代表吉他的最大音量。音量不能小於00也不能大於maxlevelmaxlevel。輸入檔案中還給定了nn個整數c1c1,c2c2,…,cncn,表示在第ii首歌開始之前吉他手想要改變的音量是多少。

吉他手想以最大的音量演奏最後一首歌,你的任務是找到這個最大音量是多少。

輸入格式

第一行依次為三個整數:nn, beginlevelbeginlevel, maxlevelmaxlevel。

第二行依次為n個整數:c1c1,c2c2,…,cncn。

輸出格式

輸出演奏最後一首歌的最大音量。如果吉他手無法避免音量低於00或者高於maxlevelmaxlevel,輸出−1−1。

樣例資料

input1

3 5 10

5 3 7

output1

10input2

4 8 20

15 2 9 10

output2

-1資料規模與約定

1≤n≤50,1≤ci≤maxlevel1≤ci≤maxlevel, 0≤beginlevel≤maxlevel。

時間限制:1s1s

空間限制:256mb

#include

using

namespace std;

int a[51]

;int f[51]

[1001];

intmain()

if(j+a[i]

<=y)}}

for(

int i=y;i>=

1;i--)}

puts

("-1");

return0;

}

t2配對

這道題是乙個狀態壓縮dp,但是我覺得自己可能調不出來,就先去寫後面的題了,最後這道題寫了個暴力,騙了點分,把我騙分的思路寫一下吧。

首先,裡面肯定有和樣例一樣,每個人只有乙個人能和他配對,所以統計的時候我們記錄一下1出現的數量,判斷其是否等於n,如果是直接輸出-1.

之後的話又寫了個分段,小資料的幾組都水過去了,狀態壓縮dp還不是特別熟,還要再看看。

騙分**就不粘了,等我看完正解再來完善一下。

t3補兵

看出來是一道dp,但是狀態都不會設,沒辦法了,那就只能接著暴力了唄,每一秒都對陣列裡存的元素操作,統計一下最後能搶到多少,時間肯定會超,但部分分還是能拿的。

t3正解:

首先我們要先清楚乙個墊刀的概念(不打遊戲的也能推出來),也就是說,我們要盡量讓小兵的血量呈現乙個階梯狀,這樣我們就可以補到更多的兵,為了使血量呈現階梯狀而補的刀就叫做墊刀,所以我們可以先對每乙個位置做乙個預處理,找一下最近的位置要墊多少刀 ,用陣列存起來,後面做乙個dp,具體狀態轉移看**吧。

題面

對於乙個dota玩家,補兵個數(creep score)是衡量一名選手能力的重要指標,特別是打路人局的時候,補兵能力就更加關鍵了,因為常常會有隊友和你搶補刀,比如,隊友操控的老鹿在開大收兵,如果你操控的是幽鬼,就需要在老鹿的aoe中偷偷補上幾刀來保證自己的發育。

我們自己建立乙個模型來大致模擬以下情況:

現在有n個小兵,每個小兵有自己的血量ai(血量一定是正整數),你和老鹿輪流對小兵進行攻擊。每次,你可以選擇對某個小兵造成1點傷害(或者你可以選擇不作為),接著,老鹿會對所有小兵造成1點aoe傷害,如此往復,直到所有小兵都死亡(血量變成0)。如果你對某個小兵造成致命傷害(使他的血量從1變成0).那麼你就補刀成功了!

對於給定的情形,你需要計算你最多可以補刀多少的小兵。

輸入格式

本題有多組測試資料,第一行為乙個整數tt,表示測試組數。 對於每一組資料,第一行乙個整數nn,表示小兵的個數,隨後第二行nn個正整數,表示每個小兵的血量。

輸出格式

對於每一組資料,輸出乙個整數m,表示補兵的最大數量。

資料規模

對於30%30%的資料,n≤100n≤100。 對於50%50%的資料,n≤500n≤500,t≤30t≤30,ai≤500ai≤500。 對於100%100%的資料,1≤n≤5001≤n≤500,1≤t≤701≤t≤70,1≤ai≤10001≤ai≤1000。

**如下

#include

using

namespace std;

const

int n=

1000+10

;int a[n]

,cnt[n]

,c[n]

,sta[n]

,f[n]

[n];

intmain()

int top=0;

for(

int i=

1;i<=ma;i++

) c[i]=0

;}}int ans=0;

for(

int i=

1;i<=ma;i++

) ans=

max(ans,f[i]

[j]);}

} cout<}return0;

}

t4 蜘蛛棋盤

這道題可以不用dp來做,但是我考試時推錯了,下面說一下正確的。

首先mn<40,m,n可以互換,所以n最大也就是6,(66=36)也就是說我們只需要考慮6種情況即可,然後對每一種情況進行分別計算

具體題目和**如下

題目描述

在乙個 n×mn×m 的棋盤上,第一天每乙個格仔上都有乙個蜘蛛。

在第一天裡每乙隻蜘蛛都可以 向上 或 向下 或 向左 或 向右 爬行 一格(不能走出棋盤); 或者待在原地不動。 多隻蜘蛛可以爬行到同乙個格仔中。

通過第一天爬行後,第二天棋盤上出現了一些空的(沒有蜘蛛的)格仔。問,第二天棋盤上最多可以空出多少個格仔?

輸入格式

一行,兩個正整n,mn,m 。

輸出格式

一行,乙個非負整數,表示最多能空出的格仔數。

樣例

輸入樣例1

1 1輸出樣例1

0輸入樣例2

2 3輸出樣例2

4資料範圍與提示

對於 20% 的資料,n=1 。

對於 50% 的資料,n≤3 。

對於 100% 的資料,1≤n,m≤40。

#include

using

namespace std;

intmain()

t5的話考試沒太仔細看,是一道樹上的dp,待完善

測試次數 (dp

x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的...

DP基礎(線性DP)總結

前言 雖然確實有點基礎.但凡事得腳踏實地地做,基礎不牢,地動山搖,嗯!dp方程 dp i max 複雜度 o n 2 法一 資料結構無腦暴力優化 以a i 為陣列下標,從1到a i 訪問最大值,再加一,進行更新 法二 設h k 表示dp值為k的最長上公升子串行的最小值 有點貪心在裡面 顯然h k h...

樹形dp總結

from 列出一些經典問題吧 1 給出一棵樹 每個節點有權值 要求父節點和子節點不能同時取 求能夠取得的最大值 hdu1520 2 給出一棵樹,求離每個節點最遠的點的距離 hdu2196 3 1 在乙個地圖上,有n座城堡,每座城堡都有一定的寶物,在每次遊戲中允許攻克m個城堡並獲得裡面的寶物。但由於地...