1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| 解法一:
dp数组记录符合的所有可能 dp[n][1~3] 长度为n时,最后面是1~3个相同的
状态转移方程: dp[i][1] = 25 * (dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3]); dp[i][2] = dp[i - 1][1]; dp[i][3] = dp[i - 1][2];
#include <iostream> #include <cstdio> #include <cstdlib> #define MOD 1000000007
using namespace std;
long long dp[2005][4] = {0};
int main() { dp[1][1] = 26; for(int i = 2; i <= 2000; i++){ dp[i][1] = 25 * (dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3]) % MOD; dp[i][2] = dp[i - 1][1]; dp[i][3] = dp[i - 1][2]; } int t, n; scanf("%d", &t); while(t--){ scanf("%d", &n); printf("%d\n", int((dp[n][1] + dp[n][2] + dp[n][3]) % MOD)); } return 0; }
解法二:
状态转移方程: dp[i] = 25 * (dp[i - 1] + dp[i - 2] + dp[i - 3]);
#include <cstdio> #define MOD 1000000007
long long dp[2005] = {0};
int main() { dp[1] = 26; dp[2] = 26 * 26; for (int i = 2; i <= 2000; ++i) dp[i]= 25 * (dp[i - 1] + dp[i - 2] + dp[i - 3]) % MOD; int t, n; scanf("%d", &t); while (t--) { scanf("%d", &n); printf("%d\n", int((dp[n] + dp[n - 1] + dp[n - 2]) % MOD)); } return 0; }
|