時間限制 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首歌去唱,每首歌有它的分數,分數高的就贏。兩兩相比,贏的人繼續兩兩相比,直到冠軍出來。分析 用乙個二維陣列儲存每個比賽歌手準備的歌曲,並且用該陣列繼續儲存每輪勝者還可以唱的歌曲。可以知道,每個歌手要保證自己每場都贏,就要用比對手最高分歌曲還高的歌曲唱,並且在...