做线性dp类的题目时,对菲波拉契数列的特殊理解
#include <iostream> using namespace std; const int N = 60; long long dp[N]; int n; void show(){ dp[0]=0;dp[1]=1; dp[2]=2;dp[3]=3;dp[4]=4; for(int i=5;i<=N;i++){ dp[i]=dp[i-1]+dp[i-3];//重点 } } int main() { show(); while(cin>>n&&(n!=0)){ cout<<dp[n]<<endl; } return 0; }
import java.util.Scanner; public class jieti { static int N = 45; static int [] dp= new int[N]; public static void main(String[] args) { Scanner input =new Scanner(System.in); int t = input.nextInt(); dp[2]=1;dp[3]=2; for(int i=4;i<N;i++) { dp[i] = dp[i-1]+dp[i-2];//区别 } for(int i=1;i<=t;i++) { int n=input.nextInt(); System.out.println(dp[n]); } input.close(); } }
两个题的来源:http://acm.hdu.edu.cn/showproblem.php?pid=2041 http://acm.hdu.edu.cn/showproblem.php?pid=2018
其中的妙用需自己体会,我是瞎猫碰死耗子。
加油,到老也要热泪盈眶。