51nod 1020 逆序排列(dp)
想破腦袋也想不到。。。。
先定義狀態,dp[i][j]表示i個數字的全排列中逆序數為j的序列的個數
剛開始做的時候,拿筆畫了一會,憑著感覺蒙了個狀態轉移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]+dp[i-1][j-1],試了下果然蒙的不可靠。。就去看討論了,找到正解。。
#include <cstdio>
#include <cstring>
int dp[1010][20010];
int n,k;
const int mod = 1e9+7;
void init()
{
int t1,t2,t3;
for(int i = 1 ; i < 1010; ++i)
{
dp[i][0] = 1;
for(int j = 1; j <= i*(i-1)/2 && j < 20010; ++j)
{
t1 = t2 = t3 = 0;
t1 = dp[i][j-1];
t2 = dp[i-1][j];
if(j >= i)
t3 = dp[i-1][j-i];
dp[i][j] = ((t1+t2-t3)%mod +mod)%mod;
}
}
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&k);
printf("%d\n",dp[n][k]);
}
return 0;
}
相關推薦
51Nod 1020 - 逆序排列(DP)
題目連結 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1020 【題目描述】 在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排
51nod 1020 逆序排列(dp)
想破腦袋也想不到。。。。 先定義狀態,dp[i][j]表示i個數字的全排列中逆序數為j的序列的個數 剛開始做的時候,拿筆畫了一會,憑著感覺蒙了個狀態轉移方程:dp[i][j]=dp[i-1][j]+
51nod 1020 逆序排列【DP】
Description 在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。 1-n的全排列中
51nod 1020 逆序排列【Dp+思維遞推優化】好題!好題!好題!
基準時間限制:2 秒 空間限制:131072 KB 分值: 80 難度:5級演算法題 在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。 如2 4 3 1中,2
51nod 1020 逆序排列 遞推DP
公式 problem 一個 def 分別是 nbsp 最大 nco 例如 1020 逆序排列 基準時間限制:2 秒 空間限制:131072 KB 分值: 80 難度:5級算法題 收藏 關註 在一個排列中,如果一對數的前後位置與大
51nod 1020 逆序排列 (DP)
基準時間限制:2 秒 空間限制:131072 KB 在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。 1
51nod 1020 逆序排列
quest 技術分享 logs class tps return mod div tput 1020 逆序排列 基準時間限制:2 秒 空間限制:131072 KB 分值: 80 難度:5級算法題 收藏 關註 在一個排列中,如果一對數的前後位置與大小順序相
51nod 1020 逆序排列 (DP_好題)
在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。 如2 4 3 1中,2 1,4 3,4 1,3
51nod 1020逆序排列
題解: 這題肯定是DP題。定義f[i][j]表示前i個數,產生j組逆序對的排列數量。那麼顯然可以想到n^3的做法,就是列舉當前第i個數放在哪裡。但是這樣是會超時的。但是我們可以稍加推導,最後得出f[i][j]=f[i][j-1]+f[i-1][j]-f
51nod 1296 有限制的排列(DP)
-1 images cli ring pre pri etc n) pan 對於一個i,如果要比鄰居大,那麽i比i-1大,i+1比i小,比鄰居小同理。設v[i]=0表示i與i-1的關系無限制,v[i]=1表示a[i-1]>a[i],v[i]=2表示a[i-1]&l
51Nod 1296 - 有限制的排列(DP)
【題目描述】 【思路】 做這道題首先要知道一種全排列的生成方式:如果要生成 [ 1 ,
51Nod 1196 - 字串的數量(DP)
【題目描述】 【思路】 做不出來,看了討論區大佬的題解才寫出來的。 這道題是V1難度,還有V2,V3根本不會,先貼上V1的題解 下面的所有字母編號都從 1
把一個整數倒序排列(java)
問題:如 123———>321 -123————>-321 120————>21 怎麼玩呢? 注意要考慮整數的範圍是-231次方到231-1 public int reverse(int x) { in
《劍指offer》系列 陣列中的逆序對(Java)
連結 牛客:陣列中的逆序對 題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 輸入描述 題目保證輸入的陣
劍指offer:陣列中的逆序對(Python)
題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 解題思路 這道題在牛客網上,有Pytho
給定一個實數陣列,按序排列(從小到大),從陣列從找出若干個數,使得這若干個數的和與M最為接近,描述一個演算法,並給出演算法的複雜度。
有N個正實數(注意是實數,大小升序排列) x1 , x2 ... xN,另有一個實數M。 需要選出若干個x,使這幾個x的和與 M 最接近。 請描述實現演算法,並指出演算法複雜度。 #define M
[luoguP2513] [HAOI2009]逆序對數列(DP)
i++ line targe cnblogs pre pid isdigit ret [1] 傳送門 f[i][j]表示前i個數,逆序對數為j的答案 則DP方程為: f[1][0] = 1; for(i = 2; i <= n; i++)
將n個數按輸入時順序的逆序排列,用函式實現(指標)
#include <stdio.h> void reverse(int a[],int n) { int *p; for(p=a+n-1;p>=a;p--) &nb
poj-3617Best Cow Line(將字串逆序排列 與原字串作比較)
FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges his cows in a line and
歸並排序&&逆序對(codves1688,4163)
如果 排序 範圍 eight 註意 sam def 序列 pad 歸並排序 歸並排序采用的是分治的思想 1、劃分問題:把序列分為元素個數盡量相等的兩半 2、遞歸求解:把兩半分別排序 3、合並問題:把兩個有序的序列合並為一個 對於第三個問題,我們可以從兩個序列中最小的元素開始