您的位置:首页 > 运维架构

poj 1157 LITTLE SHOP OF FLOWERS(DP)

2014-10-31 11:15 302 查看
dp[i][j]表示处理到了第i束花,且第i束花在第j个花瓶里。

转移就是dp[i][j]=max(dp[i-1][k])+price[i][j] (枚举k,k的范围是从i-1到j)

注意这里面有负值,所以在写for循环的时候一定要注意处理边界,使得不合法情况都不会被访问到,否则可能会访问到非法的值为0的状态。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF (-10000000)
int dp[105][105];
int F,V;
int a[105][105];
int main(){
	    scanf("%d%d",&F,&V);
		memset(a,0,sizeof(a));
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=F;i++){
			for(int j=1;j<=V;j++){
				scanf("%d",&a[i][j]);
			}
		}
		for(int i=1;i<=F;i++){
			for(int j=i;j<=V-F+i;j++){
				int tmp=INF;
				for(int k=i-1;k<j;k++){
					tmp=max(tmp,dp[i-1][k]);
				}
				dp[i][j]=tmp+a[i][j];
			}
		}
		int res=INF;
		for(int i=F;i<=V;i++){
			res=max(res,dp[F][i]);
		}
		printf("%d\n",res);
	    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: