1. 程式人生 > >51nod 1020 逆序排列(dp)

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、合並問題:把兩個有序的序列合並為一個 對於第三個問題,我們可以從兩個序列中最小的元素開始