| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
非常简单思路 记忆化搜索 (dp) 供大家学习f(n,x)代表长度为n 的 左边n/2位的和 减去 右边n/2位的和 为 x 的方法数
首先有对称性: f(n,-x)==f(n,x)
接下来我们举例说明转移方程,比如六位数:
—— —— —— —— —— —— 要求左右和差为 x
我们把它分开来看成:
—— —— —— —— 四位数,假设左右和之差为a
—— —— 两位数,。。。。。。。为b
那么a+b==x 的话即使我们要求的六位数
下面由乘法原理即可得到,并且注意到 a,b 的范围是与长度有关的,所以
只累加符合范围之内的 如 -9<=b<=9
函数如下:
int f(int n,int x)
{
if(dp[n][x]!=-1)return dp[n][x];//记忆化
if(n==2)
{
int sum=0;
for(int a=0;a<=9;a++)
for(int b=0;b<=9;b++)
if(a-b==x)sum++;
return dp[n][x]=sum;
}
int a,b,sum=0;
for(b=-9;b<=9;b++)
{
a=x-b;
if(a>=-9*(n-2)/2&&a<=9*(n-2)/2)
sum+=f(n-2,abs(a))*f(2,abs(b));
}
return dp[n][x]=sum;
}
其实,个人建议很多dp题都可以用递归函数+状态记忆写出,既方便又好理解,
行云流水,而本质上来说,dp其实就是记忆化的搜索,搜索还是核心吧
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator