mission3--dp

A---母牛的故事ios

題目大意:第一年有一頭母牛,每一年年初母牛生小母牛,小母牛第四個年頭能夠開始生小牛。spa

問第n年有多少頭牛。code

題解:blog

(1)列出前幾項來找規律(2)第i年牛的數量=第i-1年牛的數量+(新出生的牛的數量=第i-3年牛的數量)string

代碼:it

#include<iostream>
#include<cstdio> 
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int n;

int dp[60];

int main()
{
    dp[1]=1;dp[2]=2;dp[3]=3;dp[4]=4;
    for(int i=5;i<=60;i++) dp[i]=dp[i-1]+dp[i-3];
    while(scanf("%d",&n)&&n) cout<<dp[n]<<endl;
    return 0;
} 

B---Cow Bowlingio

 

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

數字金字塔 從上往下走只能走左右求到最後一層的最大值stream

n<=350 搜索不行呀 從上往下推搜索

代碼: 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int n;

int ans;

int a[360][360];

int f[360][360];

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    f[1][1]=a[1][1];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
        }
    }
    for(int i=1;i<=n;i++)ans=max(ans,f[n][i]);
    cout<<ans<<endl;
    return 0;
} 

C---Sumsets

題目大意:

一個數分紅幾個2的x次方的和的方案數

如:

 

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)打表找規律 找出遞推式

a、若是i是奇數,那麼a[i]=a[i-1];在i-1的數的方法數+1

b、若是i是偶數,那麼a[i]=a[i-1]+a[i/2];

若是i是偶數 在i-1的數+1 i/2的方案數裏都*2;

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define M 1000000
using namespace std;


int n,p;

int ans;

int b[100];

void dfs(int x,int now,int sum)
{
    if(sum>now) return ;
    if(sum==now)
    {
        ans++;
        return;
    } 
    for(int i=x;i>=0;i--) //i>=0不是i 
    {
        dfs(i,now,sum+b[i]);
    }
} 
int main()
{
    b[0]=1;
    for(int i=1;i;i++)
    {
        b[i]=b[i-1]*2;
        if(b[i]>M)
        {
            p=i;break;
        } 
    }
    for(int i=1;i<=20;i++) 
    {
        ans=0;
        dfs(p,i,0);
        cout<<ans<<endl;
    }
    return 0;
} 

 

#include<iostream>
#include<cstdio> 
#include<cstring>
#include<algorithm>
#define M 1000000000
using namespace std;

int n;

int a[1000001];

int main()
{
    scanf("%d",&n);
    a[1]=1;a[2]=2;a[3]=2;a[4]=4;
    for(int i=5;i<=n;i++) 
    {
        if(i%2) a[i]=a[i-1]%M;
        else a[i]=(a[i-2]+a[i/2])%M;
    }
    cout<<a[n];
    return 0;
} 
本站公眾號
   歡迎關注本站公眾號,獲取更多信息