程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> zoj 3149 Breadtree(樸素DP)

zoj 3149 Breadtree(樸素DP)

編輯:C++入門知識

zoj 3149 Breadtree(樸素DP)


 

題目大意:

第1天的時候,有一個空節點。之後每一天,每一個節點都會長一顆果實。並且再生成一個節點(每個節點最多生成K個節點)。

當果實的總數大於1234567890個時,就不會再生長了。問第N天的時候一共有多少個果實。

 

解題思路:

這個題目有顯然的最優子結構問題,定義dp[i]等於某一個節點i天後生成的果實數。

那麼dp[i] = i+dp[i-1]+dp[i-2]+...+dp[i-k];

具體的原因就是:某一個節點的總果實數等於他本身的i個加前一天生成的節點所增加的果實再加。。。。

 

而且能夠看出來這個增長是平方級別的。那麼復雜度大約就是根號1234567890。

 

 

#include 
#include 
typedef long long LL;
#define maxn 66666
#define INF 1234567890
using namespace std;
LL dp[maxn];
LL sum[maxn];
LL n,k;
int main()
{
    while(scanf(%lld %lld,&n,&k),n||k)
    {
        if(k ==0)
        {
            printf(%lld
,n-1>INF+1?INF+1:n-1);
            continue;
        }
        n--;
        memset(dp,0,sizeof dp);
        memset(sum,0,sizeof sum);
        LL ans = -1;
        for(int i = 1;i <= n;i++)
        {
            dp[i] = i + sum[i-1];
            if(i-k-1>=0) dp[i]-= sum[i-k-1];
            sum[i] = dp[i]+sum[i-1];
            if(dp[i] > INF)
            {
                n = i;
                break;
            }
        }
        printf(%lld
,dp[n]);
    }
    return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved