逆序對 動態規劃 高精度

2021-06-01 14:08:38 字數 1828 閱讀 6326

from

kqzxcmh

☆逆序對

背景 background

柯橋中學60周年校慶歡樂賽第3題

描述 description

問題概括:n個元素的排序一共有n!個,詢問排列中逆序對個數為m個的排列有多少個。

輸入格式 input format

輸入檔案僅一行有兩個正整數n,m

輸出格式 output format

僅有一行,即滿足要求的排列的個數

樣例輸入 sample input [複製資料]

樣例輸出 sample output [複製資料]

時間限制 time limitation1s

注釋 hint

對於20%的資料,n<=10

對於40%的資料,n<=20

對於100%的資料,1<=n<=50  m<=(n-1)*n/2

problem 3 逆序對 pair

考察演算法 動態規劃+高精度

題目大意 求1~n 的排列中有多少個排列的逆序對個數剛好為 m個。

主要演算法 本題的動態規劃演算法很容易想到。f[i,j]表示 1~i 形成的排列中恰好有 j對

逆序對的個數。那麼動態規劃就可以用插入法來做,將 i+1 插入到i+1 個位置

中可以增加0~i個逆序對。

i-1轉移方程為 f[i, j]= f[i-1, j -k](j >=k)

∑k=0

因為 n<=50,結果就要用高精度來做了。

const md=1000000;

type arr=array[0..100] of longint;

var f:array[0..50,0..500] of arr;

n,m,i,j,k,sum:longint;

procedure jia(var a,b:arr);

var i,j,len:longint;

begin

if a[0]>b[0] then len:=a[0]

else len:=b[0];

for i:=1 to len do

begin

a[i]:=a[i]+b[i];

a[i+1]:=a[i+1]+a[i] div md;

a[i]:=a[i] mod md;

end;

if a[len+1]>0 then inc(len);

a[0]:=len;

end;

procedure print(a:arr);

var i:longint;

begin

write(a[a[0]]);

for i:=a[0]-1 downto 1 do

begin

if a[i]<100000 then write(0);

if a[i]<10000 then write(0);

if a[i]<1000 then write(0);

if a[i]<100 then write(0);

if a[i]<10 then write(0);

write(a[i]);

end;

end;

begin

readln(n,m);

f[0,0][0]:=1; f[0,0][1]:=1;

for i:=1 to n do

for j:=0 to m do

for k:=0 to i-1 do

if k<=j then

jia(f[i,j],f[i-1,j-k]);

print(f[n,m]);

end.

過河卒 動態規劃 高精度

題目 過河卒 問題編號 69 如圖,a 點有乙個過河卒,需要走到目標 b 點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如上圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c 點上的馬可以控制 9 個點 圖中的p1,p2 p8 和 c 卒不能通過對...

動態規劃 取數遊戲 高精度區間DP

問題描述 帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的n m 的矩陣,矩陣中的每個元素aij均 為非負整數。遊戲規則如下 1.每次取數時須從每行各取走乙個元素,共n個。m次後取完矩陣所有元素 2.每次取走的各個元素只能是該元素所在行的行首或行尾 3.每次取數都有乙個得分值,為每行取數的得分之和,...

動態逆序對

容易寫掛 對於新手與蒟蒻 洛谷 cdq 如果按照三維偏序那樣求,那麼會漏掉一些情況。所以要跑兩遍cdq。兩遍cdq又會有乙個問題,就是判等於的問題。第一遍cdq第三維判等於,第二遍判不等於.include define ll long long using namespace std inline ...