不能用记忆化搜索。。。会超时的。。。。。而且是绝逼会超时 因为你自己就算不出样例
dp[i][j]表示 用上第i个骰子全部之和是j的个数
用一个temp来累加 避免重复计算和
然后状态转移方程是:
if( j <= K ){
temp += dp[now^1][j-1] % mod;
}else{
temp += ( dp[now^1][j-1] - dp[now^1][j-K-1] ) % mod;
}
dp[now][j] = temp%mod;
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define mod 100000007
int main(){
long long dp[2][15001];
int N, K, S;
int T, Case = 1;
cin >> T;
while( T-- ){
cin >> N >> K >> S;
memset( dp, 0, sizeof( dp ) );
dp[0][0] = 1;
int now = 0;
for( int i = 1; i <= N; i++ ){
now ^= 1;
long long temp = 0;
dp[now][0] = 0;//注意 这里 因为初始化的时候dp[0][0]是1 但是之后 dp[now][0] 是全部为0的
for( int j = 1; j <= S; j++ ){
if( j <= K ){
temp += dp[now^1][j-1] % mod;
}else{
temp += ( dp[now^1][j-1] - dp[now^1][j-K-1] ) % mod;
}
dp[now][j] = temp%mod;
}
}
cout << "Case " << Case++ << ": " << dp[now][S] << endl;
}
return 0;
}