Lightoj 1145 DP

来源:互联网 发布:单页面优化 编辑:程序博客网 时间:2024/05/16 11:18

不能用记忆化搜索。。。会超时的。。。。。而且是绝逼会超时  因为你自己就算不出样例

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 100000007int 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;}