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;
}
posted @ 2021-04-03 19:44  IdiotNe  阅读(54)  评论(0编辑  收藏  举报