暑期個人賽 第六場 B(常複習 !!!)

2021-06-22 23:03:01 字數 2026 閱讀 1842

時間限制 4000 ms

記憶體限制 65536 kb

小弱有n個玩具,現在小弱想把他們排列成一行,把玩具j放在玩具i的右邊相鄰的位置上,他將得到乙個高興值hij.

輸入有多組資料。

每組資料以乙個整數n(n <= 18)開頭。

接下來n行, 每行n個整數。 第i行第j列hij( hij的絕對值 <= 10000)代表把玩具j放在玩具i的右邊相鄰的位置時高興值。輸入保證hii = 0,最左邊只考慮與右邊相鄰的玩具,最右邊只考慮與左邊相鄰的玩具。

對於每組資料輸出最大高興值。

2

0 12 0

30 -1 7

3 0 3

3 3 0

2 

10

賽中提交:null

賽後ac:wa wa wa wa wa wa ac

題目大意:

hij代表將j號放在i號右邊時所可以得到的收益,最左和最右只與其右其左有關(也就是受第乙個被放置的收益為零,最後乙個放置的收益由其左邊的決定)

要求求出乙個排序使得收益最大。

方法:狀態壓縮dp

反省:為什麼比賽中沒有想出來呢?

其實在比賽中還是想到了狀壓dp的,因為發現即使使用三個下標也無法準確表現狀態

但是看到n最大是18,誤以為這麼大的n不能用狀壓,所以誤認為是自己的dp水平不夠

就沒有用狀壓了

所以總的來說,就是自己對dp還不夠熟悉,不夠有信心;

自己對狀壓dp不夠熟悉,不知道只要不超過20都可以用狀壓,而且不了解狀壓的模型

那麼為什麼賽後也沒有很快ac呢- -首先不夠自信是第一,總是擔心dp過程出錯,一直在檢查

但是其實錯誤時因為收益是有可能出現負值的,但是res只初始化為0而不是-999999999...罪該萬死啊啊~!!!

另外,為什麼給這次加上常複習的標籤呢?

(1)因為這題貌似是做dp這麼久以來第一次自己有目的的更改dp式後自己ac的題目

以前比較缺乏自己檢驗遞推式正確匯出遞推式的能力,看著迴圈也很難在腦中過出dp的過程

實際上這個過程是十分重要的,這次是第一次那麼完整的做到了,以後也要注意加強

(2)還因為由於出自自己的手,這是乙個十分適合自己使用的狀壓dp的模板

這裡總結一下需要注意的地方,

(1)dp迴圈的起點和終點,這個時候要注意檢查dp下標和收益函式的對應關係

(2)迴圈(座標)的先後次序。這個需要自己在腦中將dp過程過一遍,弄清楚哪些資料是先計算出來用於後邊計算的

有沒有出現後效性失效,以及已經計算到後面,但是前面還沒計算到的情況

下面是ac**:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 20

#define inf -999999999

using namespace std;

int h[20][20]=;

int dp[600000][20];

int main()

{ int n;

while(scanf("%d",&n)!=eof){

int a,b,c;

for(int i=0;i>i)&1))

for(int j=0;j>j)&1)&&i!=j){

dp[s|(1<

2020NYIST個人積分賽第六場 D

題意 給n個點,m條邊,讓構建乙個有向無環無重邊的圖,並且圖的最短路是素數,最小生成樹也是素數。思路 題意的可塑造性很強,我們可以讓最小生成樹就是最短路,呢麼我們現在就是給最小生成樹找乙個素數,很明顯最小生成樹的素數範圍在 1,1e14 1,1e14 1,1e1 4 所以預處理1 1e14不太可能,...

2020NYIST個人積分賽第六場 H

我看沒人寫這題題解,那本菜雞來寫一下 題意 給長度為n的序列,m次詢問,每次詢問區間 l,r l,r l,r 中有多少數符合該數出現的個數等於它本身 思路 這題的題意非常符合莫隊演算法 莫隊演算法的時間複雜度是o n sqrt n o nsqrt n o nsqr t n 所以如果常數很大的話,會t...

2018 8 4牛客網暑期ACM訓練第六場 A題

題目大意 有2 n個歌手,每個歌手會準備n首歌去唱,每首歌有它的分數,分數高的就贏。兩兩相比,贏的人繼續兩兩相比,直到冠軍出來。分析 用乙個二維陣列儲存每個比賽歌手準備的歌曲,並且用該陣列繼續儲存每輪勝者還可以唱的歌曲。可以知道,每個歌手要保證自己每場都贏,就要用比對手最高分歌曲還高的歌曲唱,並且在...