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 ...