結果
問題 | No.45 回転寿司 |
ユーザー | arishiki |
提出日時 | 2016-04-08 12:47:08 |
言語 | C90 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 1 ms / 5,000 ms |
コード長 | 1,471 bytes |
コンパイル時間 | 257 ms |
コンパイル使用メモリ | 21,504 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-08 10:15:20 |
合計ジャッジ時間 | 919 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 0 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,376 KB |
testcase_02 | AC | 1 ms
5,376 KB |
testcase_03 | AC | 1 ms
5,376 KB |
testcase_04 | AC | 1 ms
5,376 KB |
testcase_05 | AC | 1 ms
5,376 KB |
testcase_06 | AC | 1 ms
5,376 KB |
testcase_07 | AC | 1 ms
5,376 KB |
testcase_08 | AC | 1 ms
5,376 KB |
testcase_09 | AC | 1 ms
5,376 KB |
testcase_10 | AC | 1 ms
5,376 KB |
testcase_11 | AC | 1 ms
5,376 KB |
testcase_12 | AC | 0 ms
5,376 KB |
testcase_13 | AC | 0 ms
5,376 KB |
testcase_14 | AC | 0 ms
5,376 KB |
testcase_15 | AC | 1 ms
5,376 KB |
testcase_16 | AC | 0 ms
5,376 KB |
testcase_17 | AC | 1 ms
5,376 KB |
testcase_18 | AC | 0 ms
5,376 KB |
testcase_19 | AC | 1 ms
5,376 KB |
testcase_20 | AC | 1 ms
5,376 KB |
testcase_21 | AC | 0 ms
5,376 KB |
testcase_22 | AC | 0 ms
5,376 KB |
testcase_23 | AC | 0 ms
5,376 KB |
testcase_24 | AC | 1 ms
5,376 KB |
testcase_25 | AC | 0 ms
5,376 KB |
testcase_26 | AC | 1 ms
5,376 KB |
testcase_27 | AC | 1 ms
5,376 KB |
testcase_28 | AC | 1 ms
5,376 KB |
testcase_29 | AC | 1 ms
5,376 KB |
testcase_30 | AC | 1 ms
5,376 KB |
testcase_31 | AC | 1 ms
5,376 KB |
testcase_32 | AC | 1 ms
5,376 KB |
testcase_33 | AC | 1 ms
5,376 KB |
コンパイルメッセージ
main.c: In function ‘main’: main.c:23:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 23 | scanf("%d", &N); | ^~~~~~~~~~~~~~~ main.c:26:20: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 26 | for(i=0;i<N;i++) scanf("%d", V+i); | ^~~~~~~~~~~~~~~~
ソースコード
#include <stdio.h> /* ルールの説明がわかりにくいが、 間を1個以上開けた上昇列として指定し、 和が最大になるようにする*/ /* 間は1個開けるか2個開けるかどっちか。 なぜなら、3つ以上開ける時、その真ん中にあるやつを他を変えずに取れるから。*/ /* 最初の2個のうち、どちらかはとることになる*/ /* 寿司の基本定理 -*-の方が*-*より大きい ならば真ん中は必ず採用 */ int mymax(int a, int b); int maxsushi(int *V, int *Memo, int i, int N); /* Vは配列、i, NはV[i]からV[i+N-1]の最大値を計算せよというindexと残り個数 Memoは、iから先の最大値が既に計算してあれば、Memo[i]にその最大値が入っている VとMemoは同じサイズの配列だと仮定している。*/ int main(void){ int i, N; scanf("%d", &N); int V[N], Memo[N]; for(i=0;i<N;i++) scanf("%d", V+i); for(i=0;i<N;i++) Memo[i]=-1; printf("%d\n", maxsushi(V, Memo, 0, N)); return 0; } int mymax(int a, int b){ if(a>b) return a; else return b; } int maxsushi(int *V, int *Memo, int i, int N){ if(N<=0) return 0; else if(N==1) return *(V+i); else if(N==2){ if(Memo[i]<0) Memo[i]=mymax(*(V+i), *(V+i+1)); return Memo[i]; } else{ if(Memo[i]<0) Memo[i]=mymax((*(V+i))+maxsushi(V, Memo, i+2, N-2), (*(V+i+1))+maxsushi(V, Memo, i+3, N-3)); return Memo[i]; } }