dp状态不一定由i-1转移过来
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-8
#define N 100110
#define M 1001000
int n,m;
ll dp[N];
ll powMod(ll a,ll b)
{
ll ret = 1;
while(b)
{
if(b&1) ret = ret*a%mod;
a = a*a%mod;
b >>= 1;
}
return ret;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[m] = 1;
for(int i=m+1;i<=n;i++)
{
dp[i] = 2*dp[i-1]%mod;
dp[i] = (dp[i]+(powMod(2,i-m-1)-dp[i-m-1]+mod)%mod)%mod;
}
printf("%lld\n",dp[n]);
}
}
本文通过一个具体的动态规划问题,展示了如何使用递推公式解决复杂的状态转移问题,并给出了完整的C++实现代码。文章中详细解释了状态定义、状态转移方程及边界条件,适合有一定编程基础并对动态规划感兴趣的读者。
704

被折叠的 条评论
为什么被折叠?



