51nod 排列與交換 序列dp

2021-08-06 06:36:33 字數 1022 閱讀 7133

算是比較簡單的七級題了吧,也是經典的序列交換型別的dp。

明顯有f[i][j]表示前i個交換j次的方案數。

對於第一問,每次轉移的時候直接把之前的方案繼承過來。

最後統計答案的時候,只要交換次數與k的奇偶性相同,就可累加到答案內,因為剩餘的步數我可以兩點之間xjb交換。。

但是會算重,因為我這樣的計算是盡量把每個數往前面交換,那這樣最後他從i到1又轉回i,方案就會算重,所以我們把這種情況減去,只儲存交換最少次數到達最終狀態的方案數,即f[i+1][i+j+1]-=f[i][j]

第二問直接dp即可,由於任意兩個都可以交換所以每一次交換的方程:

f[i][j]+=f[i-1][j]+(i-1)*f[i][j-1]

i-1是因為這一次交換可以和前面任意i-1個交換。。

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

using namespace std;

const int n=3e3+5;

const int mo=1e9+7;

int f[n][n];

int n,m;

int main()

}int ans=0;

fo(i,0,m)if (m

%2==i%2)ans=(ans+f[n][i])%mo;

printf("%d ",ans);

ans=0,memset(f,0,sizeof(f));

fo(i,1,n)f[i][0]=1;

fo(i,1,n)

fo(j,1,m)f[i][j]=(f[i-1][j]+1ll*(i-1)*f[i-1][j-1]%mo)%mo;

fo(i,0,m)ans=(ans+f[n][i])%mo;

printf("%d\n",ans);

}

51Nod 建設國家(DP)

1475 建設國家 基準時間限制 1 秒 空間限制 131072 kb 分值 20難度 3級演算法題 小c現在想建設乙個國家。這個國家中有乙個首都,然後有若干個中間站,還有若干個城市。現在小c想把國家建造成這樣的形狀 選若干 可以是0個 的中間站把他們連成一條直線,然後把首都 首都也是乙個中間站 連...

51nod 序列分解(dfs)

1400 序列分解 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 小刀和大刀是雙胞胎兄弟。今天他們玩乙個有意思的遊戲。大刀給小刀準備了乙個長度為n的整數序列。小刀試著把這個序列分解成兩個長度為n 2的子串行。這兩個子串行必須滿足以下兩個條件 1.他們不能相互重疊...

51nod 1250 排列與交換

題目大意 你有乙個初始為 1 到 n的順序陣列 問題一 恰好進行 k 次相鄰交換,最後有多少不同的排列 問題二 進行不多於 k次交換 不一定相鄰 最後有多少種不同的排列 n k 3000 思路 這道題沒有什麼新意,其主要思路就是將恰好變為最少,即乙個排列我們要用最少的操作次數得到。對於第一問,考慮乙...