您的位置:首页 > 其它

动态规划(Memory and Scores,cf 712D)

2016-09-12 11:38 513 查看
http://blog.csdn.net/jasonvictoryan/article/details/52502382




数组开的不够大也是会导致超时的,

宏定义max只比调用max快一点。快10%不到。

滚动数组以及用O(1)更新的方法挺不错,学到了。

#include<bits/stdc++.h>
//#define Max(a,b) (((a)>(b))?a:b)
//#define Min(a,b) (((a)<(b))?a:b)
using namespace std;
const int mod=1000000007;
const int os=201000;
const int MAX=(os<<1);
int dp[2][MAX];

int main()
{
int a,b,k,t;
scanf("%d %d %d %d",&a,&b,&k,&t);
int now=0;
dp[now][a-b+os]=1;
dp[now][a-b+os+1]=mod-1;
for(int i=1;i<=2*t;i++)
{
int ad=0;
for(int j=0;j<MAX;j++)
{
ad=(ad+dp[now][j])%mod;
dp[now][j]=0;
int posl=max(j-k,0);
int posr=min(j+k+1,MAX-1);
dp[now^1][posl]=(dp[now^1][posl]+ad)%mod;
dp[now^1][posr]=(dp[now^1][posr]-ad+mod)%mod;
}
now^=1;
}
int ans=0;
int ad=0;
for(int i=0;i<MAX;i++)
{
ad=(ad+dp[now][i])%mod;
if(i>os)
ans=(ans+ad)%mod;
}
printf("%d\n",ans);
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: