牛牛喜歡這樣的陣列:
1:長度為n
2:每乙個數都在1到k之間
3:對於任意連續的兩個數a,b,a<=b 與(a % b != 0) 兩個條件至少成立乙個
請問一共有多少滿足條件的陣列,對1e9+7取模
輸入兩個整數n,k1 ≤ n ≤ 10
1 ≤ k ≤ 100000
輸出乙個整數示例1
複製2 2
2 2複製3
3示例2
複製9 1
9 1複製1
1示例3
複製3 3
3 3複製15
15示例4
複製2 1234
2 1234複製1515011
1515011思路 : 該題是參考的其他網友的,大致思路知道了。動態規劃是真難。
dp[i][j] 表示長度為 i 的 , 以 j 結尾的 符合條件的陣列個數 , 把握住 , 長度為 i 的陣列 和 長度為 i- 1 的陣列的長度 。
dp[i][j] 是 dp[i-1][j] 加上乙個元素 x 得到的 , 他應該是 所有以 i-1 長度的陣列個數 減輕 不符合 條件的陣列 個數.
條件 3 , 任意乙個 連續的 a , b , 都有 a<=b 或者 a%b!=0 , 也就是 a 不能是 b的倍數 .看**能理解。
#include #include #include #include using namespace std ;
typedef long long ll ;
/* 牛牛與陣列
*/const int max = 1050 ;
const int inf = 0x3f3f3f3f ;
const int mod = 1e9+7 ;
int n , k ;
int dp[20][100001] ;
// dp[i][j] 表示長度為 i 且尾數為 j的陣列個數
int main()
int sum = 0 ;
int sum1 = 0 ;
for(int i = 2 ; i<=n; i++ )
for(int j = 1 ; j<=k ; j++ )
// 長度為 i且以j結尾的 陣列個數 = 長度為 i-1 的陣列個數 - 長度為 i-1 的且以 是 j 的倍數的陣列個數
dp[i][j] = (sum- sum1) %mod ; }}
int ans = 0 ;
for(int i = 1 ; i<= k ; i++ )
cout
}
牛牛與陣列DP
思路 如果正著計算容易出現遺漏,所以我們只用找 a b a是b的倍數 的方案數,然後用總數減去這個方案數就是答案。思考用dp來解決這個問題,設dp i j 表示長度為 i 的陣列第 i 位為 j 的符合要求的陣列方案數。1 i n 1 j k 邏輯 n個數的陣列,先初始化dp 1 i 1。三重迴圈,...
牛牛與陣列(DP)
牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 輸入兩個整數n,k 1 n 10 1 k 100000輸出乙個整數輸入 2 2輸出3輸入 9 1輸出1輸入 3 ...
牛牛與陣列(DP)
牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 輸入兩個整數n,k 1 n 10 1 k 100000輸出乙個整數 dp i j 表示前i個序列,第i個位j的時...