1932 : The Triangle


何の問題ですか。


注釈テンプレートを利用して最高価格を求める問題.

試行錯誤回数


一度の成功

観察する

  • のサンプルコードから、行のサイズが列であることがわかります.たとえば、3列目の場合、行のサイズは3(1,2,3行)です.
  • の最も左側と右側を除いて、中間の数は自分の上の左側と右側の数の中で最も値を使うべきです.
  • 最初の試み:コミュニケーション


    一番左のインデックスは0で、一番右のインデックスは列です.問題で最低価格を要求したので、最低価格にしました.
    #include <stdio.h>
    
    int D[500][500];
    
    int main()
    {
    	int N,i,j,M=0;
    	scanf("%d",&N);
    	for(i=0;i<N;i++) {
    		for(j=0;j<=i;j++) scanf("%d",&D[i][j]);
    		if(i) {
    			for(j=0;j<=i;j++) {
    				if(!j) D[i][j]+=D[i-1][j];
    				else if(j==i) D[i][j]+=D[i-1][j-1];
    				else D[i][j]+=D[i-1][j-1]>D[i-1][j]?D[i-1][j-1]:D[i-1][j];
    			}
    		}
    	}
    	for(j=0;j<N;j++)
    		if(M<D[i-1][j]) M=D[i-1][j];
    	printf("%d",M);
    }
    前に解いた1149問について反省し,今回は直接代入演算子(+=)を用いた.

    他の人の答え


    加算は交換法則を成立させる.だから降りるときはもっと作ることができますが、遡ることもできます.
    また、最低価格の問題条件特性を利用して、0に初期化された部分(例えば、三角形の一番左より左側の部分)は無条件に除外される.コードをさらに減らすことができます.
    #include <stdio.h>
    #define MAX(a,b) (a>b ? a : b)
    int main()
    {
    	int i,j,n,A[501][501];
    	scanf("%d",&n);
    	for(i=1;i<=n;i++) for(j=1;j<=i;j++) scanf("%d",A[i]+j);
    	for(i=n-1;i;i--) for(j=1;j<=i;j++)
    		A[i][j]+=MAX(A[i+1][j],A[i+1][j+1]);
    	printf("%d",A[1][1]);
    	return 0;
    }
    f52985のソース
    -> https://www.acmicpc.net/source/358547
    そしてC言語マクロで記述できることが分かった.これから必要なときも使ってみます

    一行が平らである.


    これは、以前に似たようなタイプが解かれていたため、問題です.