HDU 1231 최대 연속 하위 시퀀스 DP

최대 연속 서브시퀀스
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
 
Description
K의 정수를 지정하는 시퀀스 {N1, N2,..., NK} 입니다. 임의의 연속 하위 시퀀스는 {Ni, Ni+1,...,
Nj}, 여기서 1 <=i <=j <=K 입니다.최대 연속 서열은 모든 연속 서열의 요소와 가장 큰 것이다.
예를 들어 주어진 서열 {-2,11,-4,13,-5,-2}의 최대 연속 서열은 {11,-4,13}이고 최대 및
20입니다. 
올해의 데이터 구조 시험지에서 컴파일러가 가장 크고
하위 서열의 첫 번째 원소와 마지막 원소. 
Input
테스트 입력에는 몇 가지 테스트 용례가 포함되어 있으며, 각 테스트 용례는 2줄을 차지하고, 첫 번째 줄은 정수 K (<10000) 를 주고, 두 번째 줄은 K 개의 정수를 주며, 중간은 빈칸으로 구분한다.K가 0일 때 입력이 끝났습니다. 이 용례는 처리되지 않습니다. 
Output
모든 테스트 용례에 대해 1줄에서 최대, 최대 연속 서열의 첫 번째와 마지막 원을 출력합니다
소, 가운데는 빈칸으로 구분한다.최대 연속 서열이 유일하지 않으면, 번호 i와 j의 가장 작은 것을 출력합니다. (예를 들어 예시를 입력한 2, 3조)모든 K 요소가 음수이면 최대 및 0을 정의하여 전체 시퀀스의 첫 번째 끝 요소를 출력합니다. 
Sample Input
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0

Sample Output
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0


Huge input, scanf is recommended.


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define FIN     freopen("input.txt","r",stdin);
#define FOUT    freopen("output.txt","w",stdout);
#define INF     0x3f3f3f3f
#define lson    l,m,rt<<1
#define rson    m+1,r,rt<<1|1
typedef long long LL;

const int MAXN=10005;
int dp[MAXN];
int A[MAXN];
int S[MAXN];//       

int main()
{
    //FIN
    int K;
    while(~scanf("%d",&K)&&K)
    {
        memset(dp,0,sizeof(dp));
        int flag=0;
        for(int i=1;i<=K;i++){
            scanf("%d",&A[i]);
            if(A[i]>=0)  flag=1;
        }
        if(flag==0)  {printf("0 %d %d
",A[1],A[K]);continue; } dp[1]=A[1]; S[1]=1; for(int i=2;i<=K;i++){ if(A[i]+dp[i-1]>=A[i]) {dp[i]=dp[i-1]+A[i];S[i]=S[i-1];} else {dp[i]=A[i];S[i]=i;} } int st=1,ed=1,res=dp[1]; for(int i=2;i<=K;i++){ if(dp[i]>res){ res=dp[i]; st=S[i]; ed=i; } } printf("%d %d %d
",res,A[st],A[ed]); } }

  
전재 대상:https://www.cnblogs.com/Hyouka/p/5732013.html

좋은 웹페이지 즐겨찾기