Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97975
  • 博文数量: 21
  • 博客积分: 145
  • 博客等级: 入伍新兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-22 17:37
文章分类

全部博文(21)

文章存档

2013年(16)

2012年(5)

我的朋友

分类: C/C++

2013-03-28 14:07:21

题目链接: 


思路:一道dp题目,还是蛮有意思的。

如果花瓶数量和花的数量一样,那么只有一种插花的方法;

如果花瓶数大于花的数量,那么就考察最后一个花瓶是否插花,可以归结为两个相应的最优子问题。


具体的状态方程如下:

用state[V][F]记录状态, V是瓶子的数量,F是花的数量。

state[i][j] = state[i-1][j-1] + value[i][j]  if i == j

state[i][j] = max { state[i-1][j-1] + value[i][j], state[i][j-1] }  if i < j



#include 
#include 

using namespace std;

#define MAX 101

class Solution {
	public:
		void run() {
			while (cin >> flowerNum >> vaseNum) {
				for (int i=1; i<=flowerNum; i++)
					for (int j=1; j<=vaseNum; j++)
						cin >> value[i][j];
				cout << dp() << endl;
			}
		}
	private:
		int dp() {
			int pre = 0, cur;
			memset(state[pre], 0, sizeof(int)*MAX);
			
			for (int i=1; i<=flowerNum; i++) {
				cur = i%2;
				pre = (i + 1) % 2;
				state[cur][i] = state[pre][i-1] + value[i][i];
				for (int j=i+1; j<=vaseNum; j++) {
					if (state[pre][j-1] + value[i][j] > state[cur][j-1])
						state[cur][j] = state[pre][j-1] + value[i][j];
					else
						state[cur][j] = state[cur][j-1];
				}
			}
			return state[cur][vaseNum];
		}

		int vaseNum;
		int flowerNum;
		int state[2][MAX];
		int value[MAX][MAX];
};

int main() {
	Solution solution;
	solution.run();

	return 0;
}


阅读(740) | 评论(0) | 转发(0) |
0

上一篇:POJ3624

下一篇:POJ1050解题报告

给主人留下些什么吧!~~