1. 程式人生 > >poj 1157 LITTLE SHOP OF FLOWERS(簡單DP)

poj 1157 LITTLE SHOP OF FLOWERS(簡單DP)

題意():將某些花放入某些花瓶中得到的觀賞價值是不同的,並且要求開始輸入的資料必須在後輸入的資料前面。即:若一號花放入了3號花瓶,那麼後面的花就不能放入12號花瓶了。

分析:簡單DPDp[i][j]表示前i朵花按順序放入前j 個花瓶中的最優觀賞價值。

狀態轉移方程:dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+map[i][j])

i朵花按順序放入前j 個花瓶中的最優觀賞價值=max(前i朵花按順序放入前j -1個花瓶中的最優觀賞價值,前i-1朵花按順序放入前j -1個花瓶中的最優觀賞價值+i朵花放入j瓶中的價值)

注意價值可能為負數。

#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;
}