牛牛與陣列 動態規劃

2021-09-25 09:39:45 字數 1522 閱讀 1377

牛牛喜歡這樣的陣列:

1:長度為n

2:每乙個數都在1到k之間

3:對於任意連續的兩個數a,b,a<=b 與(a % b != 0) 兩個條件至少成立乙個

請問一共有多少滿足條件的陣列,對1e9+7取模

但是思想是對的,n+1個數會受到n個數的貢獻

然後想一下如果第n位是乙個數 

第n+1位是i的數值就是第n位是j 且滿足(j%i!=0||j<=i) 的所有加和 

設dp[i][j]是第i位是j的個數

先是一發會超時的**

思路:想一下如果第n位是乙個數 

第n+1位是i的數值就是第n位是j 且滿足(j%i!=0||j<=i) 的所有加和

//設dp[i][j]是第i位是j的個數

//走二維表n*k

//然後另一層for列舉dp[i-1]的數值 如果此位符合條件可以貢獻給dp[i][j]

#include #define ll long long

using namespace std;

const int mod=1e9+7;

const int maxx=1e5+7;

ll dp[12][maxx];

int main()

/*for(a=1;a<=n;a++)// 輸出dp陣列

printf("\n\n");

*/

}for(i=1;i<=k;i++)

printf("%lld\n",res);

return 0;

}

然後是優化:

設dp[i][j]是第i位是j的個數

只能對第三層for找前面一位時的過程進行壓縮

首先我們可以先處理出i的倍數並將其標記

用vector 二維陣列好一點

然後一遍for用乙個ans記錄前一位能用的總和 但是此時多加上了前一位是當前位的倍數

再用vector陣列中把標記好的i的倍數的dp【i-1】【a【j】【p】】的值刪掉

#include #define ll long long

using namespace std;

const int mod=1e9+7;

const int maxx=1e5+7;

ll dp[12][maxx];

vector a[maxx];

int main()

memset(dp,0,sizeof(dp));

for(i=1;i<=k;i++) dp[1][i]=1;

ans=0;

temp=0;

sum=0;

for(i=2 ;i<=n;i++)

for(j=1;j<=k;j++)

dp[i][j]=(ans-temp)%mod;}}

for(i=1;i<=k;i++) res=(res+dp[n][i])%mod;

printf("%lld\n",res);

return 0;

}

牛牛與陣列

牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 輸入兩個整數n,k 1 n 10 1 k 100000輸出乙個整數示例1 複製2 2 2 2複製3 3示例2 複...

牛牛與陣列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 ...