poj 1157 LITTLE SHOP OF FLOWERS——简单DP
这段时间都在做DP啊啊……
大意:有F朵花和V个花瓶,F<V,不同的花在不同的花瓶里面观赏价值不一样,每个花瓶只能插一束花,而且花要按顺序插。求最大观赏价值。
这个题关键就是有负值,注意初始化,在代码里面说把。。
状态转移方程:
dp[i][j]表示把i朵花插到j个花瓶里面能获得的最大美学价值
则dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+map[i][j])
PS:我现在都没明白怎么看题目满足最优子结构性质……汗啊啊啊啊啊……
Problem: 1157 | User: a27400 | |
Memory: 484K | Time: 32MS | |
Language: G++ |
Result: Accepted |
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 10000
int dp[110][110];
int map[110][110];
int max(int a,int b)
{
return a>b?a:b;
}
int main(void)
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
for(int i=0;i<=n;i++)
for(int j=0;j<i;j++)
dp[i][j]=-INF;//这个地方的初始化要注意!!
for(int j=1;j<=m;j++)
for(int i=1;i<=-max(-n,-j);i++)
{
dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+map[i][j]);
}
printf("%d\n",dp[n][m]);
}