1. 程式人生 > >【題解】hdu1024 線性DP

【題解】hdu1024 線性DP

題目連結

//dp[j]表示j在當前子序列的最優值,mk[j]表示上個子序列中1~j的dp的最大值 
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int N=1e6+10;
int dp[N],mk[N],num[N];
int main()
{
    //freopen("in.txt","r",stdin);
    int m,n,i,j,maxn;
    while(~scanf("%d%d"
,&m,&n)) { for(i=1;i<=n;i++)scanf("%d",&num[i]); memset(dp,0,sizeof(dp)); memset(mk,0,sizeof(mk)); for(i=1;i<=m;i++)//列舉子序列 { maxn=-INF; for(j=i;j<=n;j++)//每個子序列最少1個元素,j=i開始 { if(i==j)dp[j]=mk[j-1
]+num[j];//第i個元素只能是第i個子序列的第一個 else dp[j]=max(dp[j-1],mk[j-1])+num[j]; //作為第i個子序列中的元素,不是第一個 mk[j-1]=maxn;//不能更新mk[j],以後要用 if(maxn<dp[j])maxn=dp[j]; } } printf("%d\n",maxn); } return 0; }