动态规划 P1121 环状最大两段子段和

P1121 环状最大两段子段和

题目描述

给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大。

输入输出格式

输入格式:

 

输入文件maxsum2.in的第一行是一个正整数N,表示了序列的长度。

第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列,第一个数和第N个数是相邻的。

 

输出格式:

 

输入文件maxsum2.out仅包括1个整数,为最大的两段子段和是多少。

 

输入输出样例

输入样例#1:
7
2 -4 3 -1 2 -4 3
输出样例#1:
9

说明

【样例说明】

一段为3

 

前缀和、后缀和的应用

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 struct data{
 8     int w,h;
 9 }book[120];
10 bool cmp(const data&a,const data&b){
11     return a.h<b.h;
12 }
13 int f[120][120];
14 int n,k,ans;
15 int main(){
16     scanf("%d%d",&n,&k);
17     for(int i=1;i<=n;i++) scanf("%d%d",&book[i].h,&book[i].w);
18     k=n-k;
19     sort(book+1,book+n+1,cmp);
20     for(int i=1;i<=n;i++)
21         for(int j=2;j<=min(i,k);j++){
22             f[i][j]=0x3f3f3f3f;
23             for(int p=j-1;p<i;p++) f[i][j]=min(f[i][j],f[p][j-1]+abs(book[i].w-book[p].w));
24         }
25     ans=0x3f3f3f3f;
26     for(int i=k;i<=n;i++) ans=min(ans,f[i][k]);
27     printf("%d",ans);
28     return 0;
29 }

 

posted @ 2017-05-31 23:31  zwube  阅读(184)  评论(0编辑  收藏  举报