Posted on 2012-04-10 11:23
C小加 閱讀(1521)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
解題報(bào)告
題意(轉(zhuǎn)):將某些花放入某些花瓶中得到的觀賞價(jià)值是不同的,并且要求開(kāi)始輸入的數(shù)據(jù)必須在后輸入的數(shù)據(jù)前面。即:若一號(hào)花放入了3號(hào)花瓶,那么后面的花就不能放入1,2號(hào)花瓶了。
分析:簡(jiǎn)單DP。Dp[i][j]表示前i朵花按順序放入前j 個(gè)花瓶中的最優(yōu)觀賞價(jià)值。
狀態(tài)轉(zhuǎn)移方程:dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+map[i][j])
前i朵花按順序放入前j 個(gè)花瓶中的最優(yōu)觀賞價(jià)值=max(前i朵花按順序放入前j -1個(gè)花瓶中的最優(yōu)觀賞價(jià)值,前i-1朵花按順序放入前j -1個(gè)花瓶中的最優(yōu)觀賞價(jià)值+第i朵花放入j瓶中的價(jià)值)
注意價(jià)值可能為負(fù)數(shù)。
#include<iostream>
#include<cstdio>
using namespace std;
const int INF=0x7fffffff-1;
int map[103][103];
int dp[103][103];
int main()
{
int f,v;
scanf("%d %d",&f,&v);
for(int i=1;i<=f;++i)
{
for(int j=1;j<=v;++j)
{
scanf("%d",&map[i][j]);
}
}
for(int i=0;i<=f;++i)
{
for(int j=0;j<=v;++j)
{
dp[i][j]=-INF;
}
}
for(int j=1;j<=v;++j)
{
int zc=min(j,f);
for(int i=1;i<=zc;++i)
{
int temp=dp[i-1][j-1]==-INF?0:dp[i-1][j-1];
dp[i][j]=max(dp[i][j-1],temp+map[i][j]);
}
}
printf("%d\n",dp[f][v]);
return 0;
}