質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1614閲覧

dpを用いた問題について

grape_ll

総合スコア83

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/05/16 02:48

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Runtime Errorは実行時間の問題ではなく、プログラムに不備があり、例外を起こしているということを意味します。
このプログラムでは、

java

1int[] n=new int[30];

の部分が怪しいです。「データセット」に入力の終わりの0を含まないのなら、データセット30個+入力終わりの0という31行の入力の可能性もあり、この場合に配列範囲外の例外が発生します。

投稿2020/05/16 03:20

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grape_ll

2020/05/16 11:07

int[] n=new int[31]としたらRuntime Errorではなくなりました。 ありがとうございます。ですが,Wrong Answerとなってしまいました。 Sampleにたいしては成功するのですが,どこが間違っているかを教えていただけると幸いです。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2020/05/16 17:40

n=30の時のパタン数は53,798,080です。これは365の倍数なので、最後の if((dp[n[j]]%365)==0) の部分がtrueになってしまいます。
grape_ll

2020/05/17 05:55

if((dp[n[j]]%3650)==0)としたら正解になりました。 ありがとうございました!
guest

0

どのように直せば制限時間内に実行できますか?

どうせ30個しかないのですし、「事前に計算して、1~30までの結果をデータで持たせる」ようにしておけば実行は一瞬です。


という極限技は置いておくとしても、dpの内容は途中で変わるわけではないですし、これを使い回すようにすれば格段に速くなるかと思います。

投稿2020/05/16 02:58

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grape_ll

2020/05/16 11:08

すいません、私の知識不足で間違った認識をしていました。 実行時間が問題ではなかったみたいです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問