格鬥 區間DP

2021-08-18 16:31:28 字數 1130 閱讀 7520

題目描述:

格鬥俱樂部是格鬥愛好者的乙個組織,在這裡,格鬥者們能通過與別的成員進行格鬥來釋放自己的壓力與輕鬆自己的情緒。最近俱樂部舉行了一場比賽,該比賽有n位選手參加,他們將圍成乙個圓圈,每一場比賽圈內任意的兩位相鄰的選手均可進行相互的格鬥,勝利者將留在圈內進入下輪比賽而失敗者則直接被送往醫院(沒有平局)。比賽是殘酷的,最後圈內將只剩下一位選手,他將是總冠軍。

我們做個奇怪的假設,兩位選手進行格鬥,他們比賽的結果總是確定的。雖然俱樂部的成員們都很喜歡格鬥,但是他們仍然很希望能獲得總冠軍。現在你通過統計已經知道了任意兩位選手格鬥的結果,你有責任告訴每位選手,如果賽程合適安排的話,他是否可能成為總冠軍。

輸入:資料第一行是乙個整數n,(1<=n<=40),表示比賽的選手數量。

接下來給出乙個n*n的「0」、「1」矩陣a(行內用空格隔開),第i行第j列為 1表示選手i能戰勝選手j,否則選手j能戰勝選手i。

你可以假定aij與aji(i≠j)均是不同的且aii=0。比賽開始時所有選手按順時針方向由編號1到編號n站成乙個圈,初始時編號1與編號n的選手是相鄰的。

輸出:輸出包含n行,每行為乙個整數「0」或「1」,「1」表示第i號選手有可能成為冠軍,「0」表示不可能。

樣例輸入:

樣例輸出:

0 1 1

0 0 1

0 0 0

思路:在做這道題的時候想到要去環,但沒有想到用區間dp的方法去實現(有點菜)。

剛開始想用圖論遍歷的方法來做,通過1~n個點中的任意乙個能否遍歷到其他的點,能就輸出1,不能就輸出0,

但題目中的條件是相鄰的兩人進行格鬥,所以這個想法就無疾而終。

用長度2倍的陣列去環,再進行區間dp。

推薦乙個部落格

**:

#includeusing  namespace  std;

const int maxn=55;

int n;

int a[maxn*2][maxn*2];//兩倍的陣列(解決環)

int f[maxn*2][maxn*2];//f[i][j]表示第i個人或第j個人能把i+1~j-1的人打敗

void init()

}void work()

int main()

return 0;

}

東莞市選 格鬥俱樂部(區間dp)

輸出 輸出包含n行,每行為乙個整數 0 或 1 1 表示第i號選手有可能成為冠軍,0 表示不可能。輸入輸出樣例1 data.in 3 0 1 1 0 0 1 0 0 0 data.out 1 0 0區間dp嘛,狀態轉移也好想,設 f i j k 表示第 i 個人到第 j 個人打完時第 k 個人能不能...

線性dp 區間dp

1 尼克的任務 額一道挺水的題,愣是做了幾個小時 動態規劃大致的思路還是找乙個轉移 換個詞就是影響 我們可以明顯看出本題的規則 空暇時,一遇到任務必須挑乙個接 求1 n時間內最大空暇時間 所以將任務排序是必要的,兩個關鍵字 再來想象一下當我做到第i 個任務時,我在 st i st i t i 1 時...

線狀DP及區間DP

這裡我們都用到動態規劃的思想 dynamic programming,簡稱dp。本質就是組合子問題來求解原問題,且對每個子問題只求解一次。一般來說四個步驟 1.刻畫乙個最優結構特徵 2.遞迴的定義最優解值 3.計算最優解的值 4.利用計算出的資訊構造乙個最優解 這邊直接給出 include incl...