HDOJ FATE 二维DP

来源:互联网 发布:音频剪辑合成软件 mac 编辑:程序博客网 时间:2024/04/29 01:18

一道很水的二维DP,但是对于DP没有什么感觉的我来说,真是辛苦了。

这么来。[疲劳值][怪物数量]=经验值。这样保存的当前疲劳值获取的最大经验者。

dp[i][j]=max( dp[i][j],dp[i-m_pl[k]][j-1]+m_exp[k] );

当经验值满足升级的条件就可以了。

#include<iostream>#include<stdio.h>#include<string>using namespace std;int max( int a,int b ){ return a>b?a:b; }int main(){ int exp,pl,n,maxn; int dp[111][111]; int mexp[111],mpl[111]; while( scanf( "%d%d%d%d",&exp,&pl,&n,&maxn )!=EOF ) {    memset( dp,0,sizeof(dp) );        for( int i=1;i<=n;i++ )    scanf( "%d%d",&mexp[i],&mpl[i] );        int i;   for( i=1;i<=pl;i++ )   {    for( int j=1;j<=maxn;j++ )    for( int k=1;k<=n;k++ )      if( i>=mpl[k] )      dp[i][j]=max( dp[i][j],dp[i-mpl[k]][j-1]+mexp[k] );if( dp[i][maxn]>=exp )    break;   }       printf( "%d\n",pl-i );  } return 0;}