递推三角形(动态规划)

蒜头君拿出两根长度为 a, b的木棍,将两端钉在一起,做了一个可以开口大小可以变化的 V 字,如下图所示。现在有一堆长度为 1 或2 的木棍边角料(可以认为它们的数目无限多)。
蒜头君想要用若干块边角料将点 X、Y 连接起来组成第三条边,使得这个三角形成为一个直角三角形,求方案数对 10007 取模的结果。注意连接的顺序不同,视为不同的方案,可根据样例进一步理解。
输入格式
输入为一行,是两个空格隔开的整数 a,b(1≤a,b≤1000)
输出格式
输出为一行,是一个整数,为取木棍的方案数对 1000710007 取模的结果
数据规模与约定
对于100% 的数据,1≤a,b≤1000
输出时每行末尾的多余空格,不影响答案正确性
样例输入1复制
3 4
样例输出1复制
8
样例输入2复制
3 5
样例输出2复制
5

题目中给的a和b的取值范围是1~1000;那么我们是不是就申请1001个数组呢?答案是错误的因为如果a和b取到很大并且他们两个不是斜边那么数组就不够了所以我们应当适当的扩大一下数组

初始化的时候令dp[0]=d[1]=1;
dp[i]表示长度为i的木棍可以由1和2两根木棍组成的方案数.
状态转移方程为dp[i]=dp[i-1]+d[i-2];因为长度为i的木棍可以由1组成也可以由2组成
例如dp[2]=dp[1]+dp[2]=2;
dp[3]=dp[2]+dp[1]=3;
dp[4]=dp[3]+dp[2]=5;
dp[5]=dp[4]+dp[3]=8;

#include<bits/stdc++.h>
using namespace std;
const int MAXN=10010;//这里应该申请大点的数组前面有解释
const int MOD=10007;
int dp[MAXN],tc;
bool check(double c){
	if(int(c)==c) return true;
	return false;
}    
void solve(){
	for(int i=2;i<=tc;i++){
		dp[i]=(dp[i-1]+dp[i-2])%MOD;
	}
	printf("%d\n",dp[tc]);
}
int main(){
	memset(dp,0,sizeof(dp));
	dp[0]=dp[1]=1;
	int a,b;
	scanf("%d%d",&a,&b);
    double c=sqrt(a*a+b*b);
	bool f=check(c);
	if(f==false){
		int temp1=max(a,b),temp2=min(a,b);
		c=sqrt(temp1*temp1-temp2*temp2);
	}
	tc=(int)c;
	solve();
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值