HDU 1024
DP关键也是难点在于如下几个地方
- 状态定义,需要满足无后效性以及最有子结构
- 状态的转移需要合理的定义以及简化
- 关于边界条件需要讨论好,满足递归过程中的循环不变式是一回事,但是边界条件中的基本式也需要满足
这么一道很简单的题,前面想复杂(状态想出来但是不知道怎么和所求最优解联系)再到后面因为初始化没考虑清楚边界条件的影响贡献了3/4个WA,实在很不应该
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <stack>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int maxn= 1e6+5;
const int INF= 0x3f3f3f3f;
int n, m;
int ar[maxn];
int dv[maxn];
int m_pre[2][maxn];
int main()
{
while (EOF!= scanf("%d %d", &m, &n)){
for (int i= 1; i<= n; ++i){
scanf("%d", ar+i);
}
int cur= 0, pre;
memset(m_pre[cur], 0, sizeof(m_pre[cur]));
dv[0]= 0;
for (int i= 1; i<= m; ++i){
pre= cur;
cur^= 1;
m_pre[cur][i-1]= -INF;
for (int j= i; j<= n; ++j){
if (j== i){
dv[j]= dv[j-1]+ar[j];
}
else{
dv[j]= max(dv[j-1], m_pre[pre][j-1])+ar[j];
}
m_pre[cur][j]= max(dv[j], m_pre[cur][j-1]);
}
}
printf("%d\n", m_pre[cur][n]);
}
return 0;
}