Javaでdpを用いた問題を解きました
発生している問題・エラーメッセージ
無し
該当のソースコード
Java
1import java.util.Scanner; 2public class kannoudou { 3 public static void main(String[] args){ 4 Scanner scan=new Scanner(System.in); 5 int[] n=new int[30]; 6 int j=0; 7 while(true){ 8 n[j]=scan.nextInt(); 9 if(n[j]==0) break; 10 j++; 11 } 12 j=0; 13 while(true){ 14 if(n[j]==0) break; 15 int[] dp=new int[n[j]+1]; 16 dp[0]=1; 17 for(int i=0;i<n[j];i++){ 18 if(i==0) dp[i+1]=dp[i]; 19 else if(i==1) dp[i+1]=dp[i]+dp[i-1]; 20 else dp[i+1]=dp[i]+dp[i-1]+dp[i-2]; 21 } 22 int ans=0; 23 //sSystem.out.println(":"+dp[n]+":"+n); 24 if(dp[n[j]]<=3650) System.out.println(1); 25 else if((dp[n[j]]%365)==0) System.out.println(dp[n[j]]/3650); 26 else System.out.println((dp[n[j]]/3650)+1); 27 j++; 28 } 29 } 30}
サンプルの答えなどは一致するのですが,Runtime Error を起こしてしまいま。
どのように直せば制限時間内に実行できますか?
問題は以下のようになっています。
一郎君の家の裏山には観音堂があります。この観音堂まではふもとから 30 段の階段があり、一郎君は、毎日のように観音堂まで遊びに行きます。一郎君は階段を1足で3段まで上がることができます。遊んでいるうちに階段の上り方の種類(段の飛ばし方の個数)が非常にたくさんあることに気がつきました。
そこで、一日に 10 種類の上り方をし、すべての上り方を試そうと考えました。しかし数学を熟知しているあなたはそんなことでは一郎君の寿命が尽きてしまうことを知っているはずです。
一郎君の計画が実現不可能であることを一郎君に納得させるために、階段の段数 n を入力とし、一日に 10 種類の上り方をするとして、一郎君がすべての上り方を実行するのに要する年数を出力するプログラムを作成してください。一年は 365 日として計算してください。一日でも必要なら一年とします。365 日なら 1 年であり、366 日なら 2 年となります。
Input
複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。 各データセットとして、段数を表す1つの整数 n (1 ≤ n ≤ 30) が1行に与えられます。
データセットの数は 30 を超えません。
Output
データセットごとに一郎君がすべての上り方を実行するのに必要な年数(整数)を1行に出力します。
Sample Input
1
10
20
25
0
Output for the Sample Input
1
1
34
701
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/16 11:07
退会済みユーザー
2020/05/16 17:40
2020/05/17 05:55