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 5class
數字金字塔 從上往下走只能走左右求到最後一層的最大值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; }