动态规划——奶牛接苹果

  参考:http://blog.sina.com.cn/s/blog_61034ad90100encg.html

  f[i][j]表示i时刻移动j次的情况,f[i][j] = Max(f[i - 1][j], f[i - 1][j - 1]) + int(a[i] == (j + 1) % 2)  表示这种情况下,接到最多苹果为在上一时刻的情况下,此次不移动和移动的最大值,再加上当前的位置是否处在新出现的水果树下。

  

// Study.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <string>
#include <algorithm>
#include <sstream>
#include <set>
#include <stack>
#define INT_MAX 2147483647 // maximum (signed) int value
#define INT_MIN (-2147483647 - 1) // minimum (signed) int value
;
#define Min(x,y) (x)<(y)?(x):(y)

using namespace std;
int n, k, f[1004][34] = { 0 }, a[1004], ans = 0;

int Max(int a, int b)
{
	return a > b ? a : b;
}

void init()

{

	cin >> n >> k;

	for (int i = 1; i <= n; i++) { cin >> a[i]; a[i] %= 2; }//处理树的编号。
}

void dp()

{

	int i, j, t;

	for (i = 1; i <= n; i++) { f[i][0] = f[i - 1][0] + int(a[i] == 1); }//初始化跳0次的情况。

	for (i = 1; i <= n; i++)
		for (j = 1; j <= min(i, k); j++)//j<=I;

		{
			//t = f[i - 1][j];
			//if (f[i - 1][j - 1]>t)t = f[i - 1][j - 1];
			//f[i][j] = t + int(a[i] == (j + 1) % 2);
			f[i][j] = Max(f[i - 1][j], f[i - 1][j - 1]);
			f[i][j] += int(a[i] == (j + 1) % 2);
		}

	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= min(i, k); j++)//j<=I;
		{
			cout << f[i][j] << " ";
		}
		cout << endl;
	}

	for (i = 0; i <= k; i++) if (f[n][i]>ans)ans = f[n][i];
	cout << ans;

}

int main()
{
	init();
	dp();
	system("pause");
	return 0;
}

  

原文地址:https://www.cnblogs.com/Oscar67/p/9405580.html

时间: 2024-10-13 02:41:38

动态规划——奶牛接苹果的相关文章

动态规划之收集苹果

路径经过的最大值(最小值):原题:平面上有N*M个格子,每个格子中放着一定数量的苹果.从左上角的格子开始, 每一步只能向下走或是向右走,每次走到一个格子就把格子里的苹果收集起来, 这样一直走到右下角,问最多能收集到多少个苹果. 不妨用一个表格来表示: {5, 8, 5, 7, 1, 8},    {1, 3, 2, 8, 7, 9},    {7, 8, 6, 6, 8, 7},    {9, 9, 8, 1, 6, 3},    {2, 4,10, 2, 6, 2},    {5, 5, 2,

动态规划之分苹果

题目描述:将M个苹果放置到N个盘子中,可以有盘子为空,但是不分顺序,例如5个苹果分到3个盘子中,1+1+3和1+3+1视为同一种方法,求所有的方法总数. ****动态规划***** import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args) 4 { 5 /* 6 *以dp[i][j]表示i个苹果放置到j个盘子的方法数 7 *i个苹果放到j个盘子中(不分顺序)分为两种情况 8 *1.

m个苹果放在n个盘子里面有多少种放法?(动态规划)

m个苹果放在n个盘子里面有多少种放法?(动态规划) 实现代码如下: #include <iostream> using namespace std; int s(int m ,int n) { if(m==0||n==1){ return 1; } if(m<n) { return s(m,m); } if(m>=n) { return s(m, n - 1) + s(m - n, n); } return 0; } int main() { int m,n; while(cin&

第五题:n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1

输出描述: 输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1. 输入例子: 4 7 15 9 5 输出例子: 3 #include<iostream> #include<algorithm> using namespace std; int a[100]; int main() { int n; while(scanf("%d",&n)>0) { int sum=0; for(int i=1;i<=n;i++) { sc

nyist oj 289 苹果 (动态规划——背包问题)

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

动态规划 洛谷P1868 饥饿的奶牛

P1868 饥饿的奶牛 题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你可以选择任意区间但不能有重复的部分. 对于奶牛来说,自然是吃的越多越好,然而奶牛智商有限,现在请你帮助他. 输入输出格式 输入格式: 第一行,N,如题 接下来N行,每行一个数x,y,如题 输出格式: 一个数,最多的区间数 输入输出样例 输入样例#1: 3 1 3 7 8 3 4 输出样例#1: 5

《收集苹果》 动态规划入门

问题描写叙述 平面上有N*M个格子,每一个格子中放着一定数量的苹果.你从左上角的格子開始,每一步仅仅能向下走或是向右走,每次走到一个格子上就把格子里的苹果收集起来,这样下去,你最多能收集到多少个苹果. 输入: 第一行输入行数和列数 然后逐行输入每一个格子的中的苹果的数量 输出: 最多能收到的苹果的个数. 思路分析 这是一个典型的二维数组DP问题 基本状态: 当你到达第x行第y列的格子的时候,收集到的苹果的数量dp[x][y]. 转移方程: 因为你仅仅能向右走或者向下走,所以当你到达第x行第y列的

NYOJ 苹果【动态规划】

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

动态规划(5)——01背包问题(NYOJ289苹果)

苹果 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹果的总价值. 样例输入 3 3 1 1 2 1 3 1 0 0 样例输出