HDU1003 最长子序列和 max sum

来源:互联网 发布:网络歌手 十三电音 编辑:程序博客网 时间:2024/05/21 10:08

序列型的动态规划找状态一般考虑起始开始的点。例如这题状态是以i结尾的序列的最长子序列和dp[i]。

#include<iostream>#include<algorithm>using namespace std;#define INF 0x3f3f3f3fint dp[100001];int num[100001];int first[100001];int main(){int m;while (cin >> m){for (int k = 1; k <= m; k++){int n;cin >> n;for (int i = 1; i <= n; i++)cin >> num[i];dp[1] = num[1];int max = num[1];int maxnum = 1;first[1] = 1;for (int i = 1; i <= n; i++){if (dp[i] + num[i + 1] >= num[i + 1]){dp[i + 1] = dp[i] + num[i + 1];first[i + 1] = first[i];}else{dp[i + 1] = num[i + 1];first[i + 1] = i + 1;}if (dp[i] > max){max = dp[i];maxnum = i;}}cout << "Case " << k << ":" << endl << max << " " << first[maxnum] << " " << maxnum << endl;if (k != m) cout << endl;}}}
一开始数组开小了一直超时。。。。。

0 0
原创粉丝点击