TCO10 whildcard 250points解题报告

这篇博客详细解析了TCO10比赛中的一道题目,涉及2000*2000规模的数据和动态规划算法。作者通过讨论如何建立n^2的DP状态转移方程,解释了如何处理边界条件并模运算,最终给出完整C++代码实现解决方案。
摘要由CSDN通过智能技术生成

学长推荐的。。。。。。

看了Ratio首先赞扬一下自己的勇气。。(汗

怎么说呢,其实应该一眼看出来的。2000*2000的数据规模,求一共有多少种方案。应该很明显是n^2的DP。

方程怎么写呢。

开始是想到,可以省略掉中间过程,直接看某个数在M次操作后的位置。但是写不出方程来。思路不够清晰条理吧。

好吧。既然是n^2的DP那么就不管三七二十一,一上来直接dp[i][j]表示前i个数j次操作后的方案数。

自己想的是,dp[i][j] = dp[i-1][j]+dp[i-1][j-1]。也就是说要么是前i-1个数自己操作j次不跟第i个扯上关系,要么是i-1个数j-1次操作了之后第i-1个数再跟第i个换。好吧。我以为前i-2个数都不能和i换了。因为一步之内不能完成。但是可以多步啊!!我去。所以说就变成

dp[i][j] = ∑dp[i-1][j-k].其中1<=k<= j。

但是要注意,如果j>=i 了怎么办呢?我们想,对于n个数,只会有0-n-1的可能性。这个看上去像不像求余?所以说其实dp[i][j]如果j>=i实际上也就是可以modM映射到某个数上去。所以就ans-=dp[i-1][j-i]。由于dp[i-1][j-i]==dp[i-1][j-2*i]的。所以说这步就相当于更相损减术实现的求余。

最后注意一下对于求模的运算。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset><

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值