这个代码在P2513对了,这道题得了60分,为什么? 下面是代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1003;
const int mod = 10000;
long long f[10005][N],n,k,cur,sum[N];// cur(0/1) 表示当前i所在的行, 1-cur = cur ^ 1 异或1得到另一行
//-------------前缀和需要处理---------
void build(int t)
{
// 根据 f[t] 的数组构建前缀和
sum[0] = 0;
for(int i=1;i<=k+1;i++)
{
sum[i] = (sum[i-1] + f[t][i-1])%mod; // 平移一下处理0下标
}
}
int query(int l, int r) //查询区间[l,r]的和
{
l++,r++; //平移一下
return (sum[r]-sum[l-1])%mod;
}
//-------------------------------------
void work() // 开始推理dp
{
cur = 0;
f[1][0] = 1;
// dp[i][j] 表示前i个数一共有j-1个逆序对的方案数,并且 f[cur] 表示当前的 dp[i]
for(int i=2;i<=n;i++)
{
build(cur^1); // 预处理 dp[i-1]
for(int j=0;j<=k;j++)// 因为我们是j-1个逆序对
{
// 计算dp[i][j]
f[cur][j] = query(max(0, j-(i-1)), j); // 求区间和
}
cur = cur^1; // cur 翻转一下
}
// 最后的时候,一定最后执行的一行命令是 cur=cur^1,那么我们的答案 dp[n] 是装在 f[cur^1] 里的
cout<<(f[cur^1][k]+mod)%mod<<endl;
}
signed main()
{
cin>>n>>k;
work();
return 0;
}