HDU-1231解题报告

来源:互联网 发布:淘宝多少转化率正常 编辑:程序博客网 时间:2024/06/06 03:46

这里用的是动态规划,就是那个记录第一个和最后一个值搞了半天。。。

这里是题目的 链接


AC代码如下:

#include<iostream>using namespace std;int main() {        int K;    while (cin>>K) {        if (0 == K) {            break;            }                int values[K];        int max_values[K];        int max = -1;        bool is_all_negtive = true;                for (int i=0; i<K; i++) {            scanf("%d", &values[i]);              max_values[i] = 0;            if (values[i] >= 0) {                is_all_negtive = false;                }        }                if (is_all_negtive) {            cout<<"0 "<<values[0]<<" "<<values[K-1]<<endl;            continue;            }                int first, end;        for (int i=0; i<K; i++) {                    if (i-1 >= 0 && max_values[i-1] + values[i] >= values[i]) {                max_values[i] = max_values[i-1] + values[i];                } else {                max_values[i] = values[i];            }                        if (max_values[i] > max) {                max = max_values[i];                end = i;            }        }                int max_cp = max;        for (int i=end; i>=0; i--) {            if (max_cp - values[i] == 0) {                while (i > 0) {                    if (values[i-1] != 0) {                        break;                        } else {                        i--;                        }                }                first = i;                break;                }            max_cp -= values[i];        }        cout<<max<<" "<<values[first]<<" "<<values[end]<<endl;    }        return 0;}


大体思路是先判断是不是都是负数,如果都是负数那么直接输出就行,只要不喊负数就使用动态规划进行求解,状态转移方程为:

max[i] = max{max[i-1] + v[i] , v[i]} ,即第i个位置的最大连续子串的值为第I-1个位置上的最大值与i的值之和 与 第i个位置值中 大的那个

因为为了考虑

7

 0 0 0 1 2 3 4

输出:10 0 4

所以输出的first和end这里要特别注意点。

0 0
原创粉丝点击