思路:d(i,j)表示以i开头,长度为j的K好数的个数,转移方程就是
for(int u = 0; u < k; ++u) { int x = abs(i - u); if(x == 1) continue; //相邻的数字相同 dp[i][j] += dp[u][j-1]; }
还有就是可能答案很大一定要一边求解一边求余。 同余定理用起来,内存可用滚动数组优化。
AC代码
#include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <utility> #include <string> #include <iostream> #include <map> #include <set> #include <vector> #include <queue> #include <stack> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10 #define inf 0x3f3f3f3f #define PI pair<int, int> typedef long long LL; const int maxn = 100 + 5; const int mod = 1000000007; int dp[2][maxn]; //d[i]表示以i开头的k好数个数 int main() { int k, l; scanf("%d%d", &k, &l); int f = 0, h = 1; for(int i = 0; i < k; ++i) dp[f][i] = 1; for(int i = 2; i <= l; ++i) { for(int j = 0; j < k; ++j) { dp[h][j] = 0; for(int ii = 0; ii < k; ++ii){ int x = abs(j - ii); if(x == 1) continue; //相邻 dp[h][j] += dp[f][ii]; dp[h][j] %= mod; } } f = 1 - f; h = 1 - h; } int ans = 0; for(int i = 1; i < k; ++i) { ans += dp[f][i]; ans %= mod; } printf("%d\n", ans); return 0; }
如有不当之处欢迎指出!