mission3 - DP

牛の物語---

効果の件名:最初の年の牛があり、各年の初め牛生まれた牛は、牛がカルヴェ四年を開始することができます。

Q.牛年nのどのように多くの頭。

ソリューション:

(1)法は前にいくつかのリストを来た私の数(2)= I-ウシ1年牛的数量+(新生まれた牛の数= I-3年牛的数量)

コード:

#include <iostreamの> 
する#include <cstdioを>  
する#include <CStringの> 
する#include <cmath> 
の#include <アルゴリズム>
 使用して 名前空間STDを、

int型のn; 

int型の DP [ 60 ]。

INT メイン()
{ 
    DPは[ 1 ] = 1 ; DPは[ 2 ] = 2 ; DP [ 3 ] = 3 ; DP [ 4 ] = 4 int型 I = 5 ; iが= < 60 DP [I] = DP [1-; I ++)は1 [] + DP I-3 ]。
    一方、(scanf関数(" %のD "、&​​N)&& N)COUT << DP [N] << ENDL。
    リターン 0 ; 
}

B ---牛のボウリング

 

           7
        3 8
      8 1 0
    2 7 4 4
 4 5 2 6 5

デジタルピラミッド だけに下るからは、最後の層の最大値を求めて行きます

ダイから下方に押されていないN <= 350の検索

コード: 

#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
する#include <cmath> 
の#include <アルゴリズム>
 使用して 名前空間STDを、

int型のn; 

int型ANS; 

INT [ 360 ] [ 360 ]。

INT [F 360 ] [ 360 ]。

INT メイン()
{ 
    scanf関数(" %のD "、&N)
    以下のためにint型 i = 1 ; iは++; iが= N < 
    { 
        ためINTJ = 1 ; J <= I; J ++ 
        { 
            scanf関数(" %のD "、および[I] [J])。
        } 
    } 
    [F 1 ] [ 1 ] = [ 1 ] [ 1 ]。
    以下のためにint型 i = 1 ; iは++; iが<= N 
    { 
        ためint型の J = 1 ; J <= I; J ++ 
        { 
            F [I] [J] = MAX([I-F 1 ] [j]は、 F [I- 1 ] [J- 1 ])+ [I] [J]。
        }
    } 
    のためにint型 I = 1 ANS = iは++; iがn = <)MAX(ANS、F [n]は[I])。
    coutの << ANS << てendl;
    リターン 0 ; 
}

C --- Sumsets

効果の件名:

X 2の電源の数にプログラム番号と番号の

以下のような:

 

1)1 + 1 + 1 + 1 + 1 + 1 + 1

2)1 + 1 + 1 + 1 + 1 + 2
3)1 + 1 + 1 + 2 + 2
4)1 + 1 + 1 + 4
5)1 + 2 + 2 + 2
6)1 + 2 + 4

ソリューション:

(1)暴力

(2)再帰を見つけるために法律を見つけるためにテーブルをヒット

、iが奇数である場合、[i]は[I-1] = I-1 + 1の方法の数で

Bは、iが偶数であれば、[I] [I-1]を= + [I / 2]。

番号iは、スキームの偶数である場合は、I-1 +1 I / 2 * 2のです。

 

#include <iostreamの> 
する#include <cstdioを> 
する#include <cmath> 
の#include <アルゴリズム>
 の#define M 1000000
 使用して 名前空間STD。


int型N、P。

int型ANS; 

int型 B [ 100 ]。

ボイド DFS(int型のx、int型今、int型の合計)
{ 
    場合(和> NOW)のリターン;
    もし(合計== 今)
    { 
        ANS ++ 返します
    } 
    のためのINTI = xで; I> = 0 ; i--)// I> = 0不是I 
    { 
        DFS(I、今、和 + B [I])。
    } 
} 
INT (メイン)
{ 
    B [ 0 ] = 1 以下のためにint型 I = 1 ; I; iは++ 
    { 
        B [I] = bの[I- 1 ] * 2 もし(B [I]> M)
        { 
            P = I。破ります; 
        } 
    } 
    のためのINT I = 1;私は= < 20 ; iは++ 
    { 
        ANS = 0 
        DFS(P、I、0 ); 
        coutの << ANS << てendl; 
    } 
    戻り 0 
}

 

#include <iostreamの> 
する#include <cstdioを>  
する#include <CStringの> 
する#include <アルゴリズム>
 の#define M 1000000000
 使用 名前空間STD。

int型のn; 

INT [ 1000001 ]。

INT メイン()
{ 
    scanf関数(" %のD "、&N)
    [ 1 ] = 1 ; [ 2 ] = 2 ; [ 3 ] = 2 ; [ 4 ] = 4 以下のためのint型 I = 5;私は++; iが<= N 
    { 
        場合、I%(2 [I] [I-=)1 ]%のMを、
         [I] =([I- 2 ] + [I / 2 ])%のM。
    } 
    COUT << [N]。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/zzyh/p/11701267.html