DP好毒瘤题!
问题描述
何老板和你玩一个加法计算游戏。
游戏开始,何老板手中有一个整数a,你手中有一个整数b。
每一轮,两人各自都从区间[-k,k]中任意取出一个整数,加到自己手中的数字上。游戏总共进行了t轮。
何老板希望,游戏结束时,他手中的数字比你手中的数字大。
问满足何老板希望的游戏方案数有多少?
如果两场游戏中,存在一轮,某个玩家取的数字不同,我们就认为这是两场方案不同的游戏。
比如:下面两场游戏,a=5,b=4,t=2,两人最终取得的分数没有变化,但我们认为这是两场不同的游戏。
第一场:
何: 5 3 2
你: 4 2 2
第二场:
何:5 3 2
你:4 1 3
输入格式
一行,四个整数a,b,k,t
1 ≤ a, b ≤ 100
1 ≤ k ≤ 1000
1 ≤ t ≤ 100
输出格式
一行,一个整数,表示计算结果。
结果可能很大,mod 1000000007 后再输出
样例输入
5 3 1 1
样例输出
8
我不会告诉你我这道题光推柿子推了两天。
我也不会告诉你我因为MOD WA了5次。
我更不会告诉你这道题的方程恶心得一批算了不能骂街。
这道题真的恶心毒瘤。/毫无防备地流下了属于真正蒟蒻的眼泪
好了让我们控制一下情绪进入正题。
首先不要看到数据范围就慌,这题复杂度是 O ( t 2 k ) O(t^2k) O(t2k) 的(话说NKOJ评测姬原来这么快的吗)。
看到这道题,显然是按照轮数划分阶段。每轮的状态又如何表示呢?我们可以用何老板和你手中数字的差值来表示。但是这样可能出现何老板手中的数字比你小的情况,所以我们要加上一个偏移量。
于是状态:
设 f [ i ] [ j ] f[i][j] f[i][j] 表示游戏进行i轮后,何老板手中数字比你多j+偏移量的方案数。
状态转移方程很好推:
f [ i ] [ j ] = f[i][j]= f[i][j]= s u m sum sum { f [ i − 1 ] [ j + l ] × ( 2 k − ∣ l ∣ + 1 ) f[i-1][j+l] \times (2k-\vert l\vert + 1) f[i−1][j+l]×(2k−∣l∣+1)} ( − 2 k ≤ l ≤ 2 k ) (-2k \leq l \leq 2k) (−2k≤l≤2k)
为什么要乘 ( 2 t − ∣ l ∣ + 1 ) (2t-\vert l\vert + 1) (2t−∣l∣+1) 呢?这是因为在一轮之内使何老板与你的差值增加 l l l 有 ( 2 k − ∣ l ∣ + 1 ) (2k-\vert l\vert + 1) (2k−∣l∣+1) 种取数方案。
妈妈我做出来这道题了!
看一下时间复杂度这不是 O ( k 2 t 2 ) O(k^2t^2) O(k2t2)吗(j那一维