ZOJ-2501

来源:互联网 发布:linux l2tp 编辑:程序博客网 时间:2024/06/06 09:20

生涯第一道DP,献给此题!当然找了道最简单的。。大意就是三个火车头,每个车能拉相同数量的车厢,问怎么分配能使乘客量最大,就是取三个等长区间使总和最大,分别DP一个区间,二个区间,三个区间的最优解就行。第一次写DP,感觉代码好丑。。话说被本题测试数据坑了,从网上下过来之后发现output和答案不一样,找了半天也没发现错在哪,结果一提交竟然AC了。。真是无语

#include<stdio.h>int max(int a, int b){return a > b ? a : b;}int main(){int t, n, m, i, a[5500], dp[3][5500];scanf("%d", &t);while (t--){scanf("%d", &n);for (i = 0; i < n; i++)scanf("%d", &a[i]);scanf("%d", &m);int sum = 0, temp;for (i = 0; i < m; i++)sum += a[i];dp[0][i - 1] = sum;temp = sum;for (; i < 2 * m; i++){temp = temp + a[i] - a[i - m];dp[0][i] = max(dp[0][i - 1], temp);sum += a[i];}dp[1][i - 1] = sum;for (; i < 3 * m; i++){temp = temp + a[i] - a[i - m];dp[0][i] = max(dp[0][i - 1], temp);dp[1][i] = max(dp[1][i - 1], temp + dp[0][i - m]);sum += a[i];}dp[2][i - 1] = sum;for (; i < n; i++){temp = temp + a[i] - a[i - m];dp[0][i] = max(dp[0][i - 1], temp);dp[1][i] = max(dp[1][i - 1], temp + dp[0][i - m]);dp[2][i] = max(dp[2][i - 1], temp + dp[1][i - m]);}printf("%d\n", dp[2][n - 1]);}return 0;}


0 0