小a的子串行

2022-05-29 20:45:10 字數 1488 閱讀 5803

【題目描述】

小a有乙個長度為n的序列,但是他忘了這個序列的樣子,他只記得序列中的數大小在[1,v]內,你可以任意選擇一些位置,並給它們賦值來組成一段子串行,需要滿足序列中的數嚴格遞增,一段子串行的「萌值」定義為序列中除最大數外所有數的乘積,若只有1個數則為1。

他想請你求出所有合法子串行的「萌值」的和

不同子串行的定義為:存在某個值不同 或 在原序列中的位置不同

輸出答案對10^9+7取模

【輸入描述】

兩個數n,v

【輸出描述】

乙個整數表示答案

【樣例】

示例1

輸入2 2輸出5

說明若x表示不選該位置,那麼合法的方案有

1 x = 1

x 1 = 1

1 2 = 1

x 2 = 1

2 x = 1

示例2

輸入3 4

輸出55

【解題思路】:

dp[i][j]:截止到第i個位置,最大數為j 的答案

假設有dp1[i][j]:截止到第i個位置,最大數為j 的排列情況數

則dp1[i][j]=dp1[i-1][j] (當第i個位置不放數時) 情況1

dp1[i][j]=dp1[i-1][j-1]+dp1[i-1][j-2]+...+dp1[i-1][1];(當第i個位置放數時) 情況2

dp[i][j] = 情況1+情況2=dp1[i-1][j]+dp1[i-1][j-1]+dp1[i-1][j-2]+...+dp1[i-1][1];

若是單純的這樣求需要乙個迴圈求第二種情況

我們可以用乙個sum直接累加,就不需要這個迴圈了

ac_code:

1 #include 2 #include 3 #include 

4 #include 5 #include

6 #include 7 #include 8 #include 9

using

namespace

std;

10 typedef long

long

ll;11

const

int maxn = 5010;12

const ll mod=1e9+7;13

14ll dp[maxn][maxn];

15int

main()

1627

}28 ll ans=0;29

for(int i=1;i<=v;i++) ans=(ans+dp[n][i])%mod;

30 printf("

%lld\n

",ans%mod);31}

32return0;

33 }

(子串行)2504 是子串行的個數

2 秒262,144 kb 20 分 3 級題 小b有乙個字串s和n個字串words 1.n 現在她想知道有多少個i滿足words i 是s的子串行。樣例解釋 a,acd,ace都是abcde的子串行,但bb不是。收起第一行輸入乙個由小寫字母組成的字串s 第二行輸入乙個數n 之後n行每行乙個字串,表...

初夏小談 NC 排序子串行問題

問題 1.牛牛定義排序子串行為乙個陣列中一段連續的子串行,並且這段子序列是非遞增或者非遞減排序的。牛牛有乙個長度為n的整數陣列a,他現在有乙個任務是把陣列a分為若干段排序子串行,牛牛想知道他最少可以把這個 陣列分為幾段排序子串行.如樣例所示,牛牛可以把陣列a劃分為 1,2,3 和 2,2,1 兩個排...

子串行 子串

def foo num list 求陣列中最大子串行的和,子串行必須連續 length len num list max value 10000000000 tmp 0 for i in range length tmp max tmp num list i num list i max value...