A Graph Problem

本文探讨了一种特定的递归数列求解方法,并通过动态规划思想实现了递归数列的有效计算。针对一系列整数n,展示了如何利用递归公式f[n]=f[n-2]+f[n-3]来解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31329#problem/D

做出前6组的情况;

当n = 1 ,{1};

当n = 2 , {1} , {2};

当n = 3, , {1 , 3 } , { 2 } ;

当n = 4 , { 1 , 3 } , { 2 , 4 } , { 1 , 4 };

当n = 5, { 1 , 3 , 5 } , { 2 , 4 } { 1 , 4 } , { 2, 5

......................

由此可知,当n与其前一个数相差一个位置的等于分f[ n - 2 ] ,相差两个位置的等于f[ n - 3 ] ;

所以f[ n ] = f[ n - 2 ] + f[ n -3 ] ;

可以理解为DP的思想,假设当n= 5 时,因为{1,3}已经出现过,相隔4后{1,3,5}不改变原有数目,但是2————>5,又有一条路,所以改变f[n]的值仅有f[ n -2 ] 和f[ n - 3 ]有影响;

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<ctime>
#include<deque>
#include<stack>
#include<bitset>
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<numeric>
#include<sstream>
#include<utility>
#include<iostream>
#include<algorithm>
#include<functional>

using namespace std ;
const int maxn = 77 ;
long long  f[ maxn ] = { 0 , 1 , 2 , 2} ;

void Union()
{
	for( int i = 4 ; i < maxn ; ++i )
	{
		f[ i ] = f[ i - 2 ] + f[ i - 3 ] ;
	}
}

int main()
{
	int n ;
	Union();
	while( scanf( "%d" , &n ) != EOF )
	{
		printf( "%lld\n" , f[ n ] ) ;
	}	 
	return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值