求助
查看原帖
求助
1015339
cosmicvoyage楼主2023/10/2 16:09

这个代码在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;
} 
2023/10/2 16:09
加载中...