• 杭电1003_Max Sum


    这是原题的链接http://acm.hdu.edu.cn/showproblem.php?pid=1003

    起初我是利用暴力的方法,求出所有序列的和的情况,每取一个序列就和以知道的最大和作对比,取大者。结果超时,代码如下,时间复杂度达到o(n^3)

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 
     6 int main(){
     7 int k;
     8 cin >> k;
     9 int q=k;
    10 int f=0;
    11 while(k--){
    12 int m;
    13 cin >> m;
    14 int a[m];
    15 for(int i=0;i<m;i++){
    16 cin >> a[i];
    17 }
    18 int tp1=0;
    19 int tp2=0;
    20 int i,j=0;
    21 int sum=0;
    22 for(i=0;i<m;i++)
    23 {
    24 
    25 for( j=0;j<=i;j++){
    26 int s=j;
    27 int sum1=0;
    28 while(s<=i){
    29 sum1+=a[s];
    30 s++;
    31 }
    32 if(sum1>sum){
    33 sum=sum1;
    34 tp1=j+1;
    35 tp2=i+1;
    36 }
    37 }
    38 }
    39 cout << "Case " <<++f<<":"<<endl;
    40 cout << sum << " " << tp1 << " " << tp2;
    41 if(k!=0){
    42 cout << endl;
    43 }
    44 }
    45 return 0;
    46 }

    必须换一种方法,考虑用动态规划,具体思路如下:

        对于第i个数,它只有两种状态,一个是接在前一个队伍的前面,另一个是自己作为队头元素。dp[i]中存放的应该在i位置时i位置所属队伍的值。

        所以统计dp中最大的值就可以知道所有队伍中的最值。据此,只需要保证dp[i]的值最大就可以。
        so 状态转移方程为:dp[i]=max(dp[i-1]+a[i], a[i]);时间复杂度o(n^2),成功accept

    代码

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    
    using namespace std;
    int array1[100002];
    int dp[100002];
    
    int main(){
    int k;
    cin >> k;
    int f=0;
    while(k--)
    {
    int a;
    cin >> a;
    int start=1;
    int end=1;
    memset(array1,0,sizeof(array1));
    memset(dp,0,sizeof(dp));
    int sum=-9999;
    int i;
    for( i=1;i<=a;i++)
    {
    cin >> array1[i];
    dp[i]=max(dp[i-1]+array1[i],array1[i]);
    if(dp[i]>sum){//用来更新sum
    sum=dp[i];
    end=i;
    }
    }
    int sum1=0;
    int j;
    for( j=end;j>=1;j--){//确定起始点
    sum1+=array1[j];
    if(sum1==sum){
    start=j;
    
    }
    
    }
    cout << "Case " <<++f<<":"<<endl;
    cout << sum << " " << start << " " << end <<endl;
    if(k!=0){
    cout << endl;
    }
    
    }
    return 0;
    }
  • 相关阅读:
    day9习题
    生产者消费者模型(吃包子例子)
    map 函数----filter函数
    #返回值包含函数
    #把函数当作参数传给另一个函数
    异常和错误!
    递归调用
    局部和全局案例!!
    全局变量与局部变量2
    全局变量与局部变量
  • 原文地址:https://www.cnblogs.com/henuliulei/p/9749992.html
Copyright © 2020-2023  润新知