poj 1163 동적 기획 (최대 및 최대)

1616 단어
제목: 삼각형을 나타내는 데이터 세트를 제시한다.노선의 각 수와 최대를 정면에서 끝까지 하는 노선을 구하다.
사고방식: dp[i][j]=max(dp[i-1][j-1], dp[i-1][j])+s[i][j].스크롤 그룹 최적화 사용하기
입력:
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
출력:
30
#include <stdio.h>
#include <string.h>
#define N 105
int dp[2][N],s[N];
int n;
int max(int a,int b){
	if(a>b)
		return a;
	return b;
}	
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d",&n)!=EOF){
		int i,j,res = -1;
		memset(dp,0,sizeof(dp));
		for(i = 1;i<=n;i++){
			for(j = 1;j<=i;j++)
				scanf("%d",&s[j]);
			for(j = 1;j<=i;j++)//       ,             
				dp[1][j] = max(dp[0][j-1],dp[0][j])+s[j];
			for(j = 0;j<=i;j++)//    
				dp[0][j] = dp[1][j];
		}
		for(i = 1;i<=n;i++)
			res = max(res,dp[1][i]);
		printf("%d
",res); } return 0; }

버전 2:
#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define INF 0x3fffffff
using namespace std;
#define N 105
int s[N],dp[N];
int n;
int main(){
    int i,j,res=0;
    scanf("%d",&n);
    memset(s,0,sizeof(s));
    memset(dp,0,sizeof(dp));
    for(i = 1;i<=n;i++){
        for(j = 1;j<=i;j++){
            scanf("%d",&s[j]);
            s[j] += max(dp[j-1],dp[j]);
        }
        for(j = 1;j<=i;j++)
            dp[j] = s[j];
    }
    for(i = 1;i<=n;i++)
        res = max(res,dp[i]);
    printf("%d
",res); return 0; }

좋은 웹페이지 즐겨찾기