题目大意
有n个位置,机器人可以在任何位置出发,然后必须走k步,每次走可以往左或往右走一步,将路径的值加起来,就是此次走路的价值,算所有路的价值总和
题解
我们设dp[i][j]为用i步走过多少次j,首先我们不考虑中间经过j的次数,只算最终到j的情况,显然是dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1],而中间经过的次数为dp[k-i][j]*dp[i][j]的和,及花i的步数走到j,再花k-i步走过j,之后只用将每个点的值乘每个点经过的次数的值加起来就是答案了
#include<cstdio>
const int MAX=5e3+5;
const int mod=1e9+7;
long long dp[MAX][MAX];
int a[MAX];
int main(){
int n,k,q;
scanf("%d%d%d",&n,&k,&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
dp[0][i]=1;
}
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
dp[i][j]%=mod;
}
}
for(int i=0;i<=k;i++){
for(int j=1;j<=n;j++){
dp[k+1][j]+=dp[i][j]*dp[k-i][j];
dp[k+1][j]%=mod;
}
}
k++;
long long ans=0;
for(int i=1;i<=n;i++){
ans+=a[i]*dp[k][i];
ans%=mod;
}
while(q--){
int i,x;
scanf("%d%d",&i,&x);
ans-=a[i]*dp[k][i];
ans%=mod;
a[i]=x;
ans+=a[i]*dp[k][i];
ans%=mod;
printf("%lld\n",(ans+mod)%mod);
}
}