题目:http://codeforces.com/problemset/problem/479/E
分析:前缀和优化的DP.一开始写跪了,但今天几分钟写出来了,于是得出一个结论:千万不要吝啬一个变量,只要能简化代码!
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int Tmax=5005;
const long long int MOD=1000000007;
int n,a,b,k;
long long int f[Tmax][Tmax],sum[Tmax],ans;
void work()
{
int i,j,x;
f[0][a]=1;
for(i=1;i<=k;i++)
{
sum[0]=0;
for(j=1;j<=n;j++)
sum[j]=sum[j-1]+f[i-1][j];
for(j=1;j<=n;j++)
{
if(j==b) continue;
if(j>b){
x=max(0,b+abs(b-j)/2);
f[i][j]=(sum[n]-sum[x]-f[i-1][j])%MOD;
}
else {
x=min(n,b-abs(b-j)/2);
f[i][j]=(sum[x-1]-f[i-1][j])%MOD;
}
}
}
for(i=1;i<=n;i++)
ans=(ans+f[k][i])%MOD;
printf("%I64d",ans);
return;
}
int main()
{
scanf("%d%d%d%d",&n,&a,&b,&k);
work();
return 0;
}