51NOD1779 逆序對統計

2022-05-12 04:56:49 字數 823 閱讀 3174

lyk最近計畫按順序做n道題目,每道題目都分為很多分數檔次,lyk覺得這些題太簡單了,於是它想到了乙個好玩的遊戲。

lyk決定將每道題目做出其中的某個分數,使得這n道題目的逆序對個數最多。

為了方便,假設共有m個分數檔次,並且會給m個分數檔次分配乙個題目編號,表示該題目會出現這個分數檔次。

題目保證每道題都存在至少乙個分數檔次。(例如樣例中5道題目的分數分別是5,6,3,4,7,共有4個逆序對)

input

第一行兩個數n,m(n<=20,m<=100)。

接下來m行,每行乙個數ai,表示第ai道題目可能會有i這個分數的檔次。

output

乙個數表示最多逆序對個數。

這個題比較困難的是狀態定義,但是m的數量並不多,所以平均下來每道題能選的狀態也就幾個或者十幾個,但暴力列舉每道題的狀態顯然不行。

腦洞開大一點,要是用百進製存狀態還不錯,但是轉移就更難了。所以不可做。

再看一遍題,發現每個檔次只能選一次誒,那就按檔次轉移吧。

因為求逆序對個數,而且檔次是從小到大給的,所以每次選擇乙個新狀態的時候,只需要在前面出現過的狀態中,找出處於的位置i的前面有多少個比它大的數已經選了。逆序對數量就要加這麼多。

#includeusing

namespace

std;

#define n 21

int dp[1

;int

main()

}printf(

"%d\n

",dp[mx]);

return0;

}

51Nod1779 逆序對統計

lyk最近計畫按順序做n道題目,每道題目都分為很多分數檔次,lyk覺得這些題太簡單了,於是它想到了乙個好玩的遊戲。lyk決定將每道題目做出其中的某個分數,使得這n道題目的逆序對個數最多。為了方便,假設共有m個分數檔次,並且會給m個分數檔次分配乙個題目編號,表示該題目會出現這個分數檔次。題目保證每道題...

51nod 1779 逆序對統計 狀壓dp

n範圍小,可以狀壓 0 1表示是否已經給這道題選擇了分數 按分數的順序列舉 在某乙個狀態中,若給第i道題選擇這個分數那麼產生的貢獻就是狀態中第i位後的1的個數 如 狀態為 10101,已經選好了1,3,5的分數,此時選擇規定第2題的分數,貢獻就是第2位之後1的個數為2 則會產生2對逆序數 一開始感覺...

51nod 1779逆序對統計(狀壓DP)

按照插入數的大小排序,然後依次進行dp。用乙個狀態表示n個數是否被選了 10110 就是表示第1 3 4個位置都選了 那麼如果此時這個數該填到5這個位置,那麼必定會造成乙個逆序 因為下乙個數會填到2,下乙個數必定比這個數大 也就是轉移的時候看插入位置前有多少個0,進行轉移 寫的時候有一些小技巧 直接...