poj 2385 树上掉苹果问题 dp算法
2024-09-03 16:02:02
题意:有树1 树2 会掉苹果,奶牛去捡,只能移动w次,开始的时候在树1 问最多可以捡多少个苹果?
思路: dp[i][j]表示i分钟移动j次捡到苹果的最大值
实例分析
0,1 1,2...说明 偶数在树1 奇数在树2
for (int i = 1; i <= n; i++)
{
scanf("%d", &t[i]);
t[i] -= 1;
}
for (int i = 1; i <= n; i++)
for (int j = 0; j <= w; j++)
{
if (j % 2) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + t[i];
else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + !t[i];
}
这里有个小技巧,不是每次要求输入1 2 2 之类的数据,我们把它们都-1 然后就可以就比较好看了
解释一下两句dp语句
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) 表示上一次要么在树1 要么在树2的情况,但是我只需要它们两者之间的最大值
解决问题的代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[][];
int t[];
int main()
{
int n, w;
scanf("%d%d", &n, &w);
for (int i = ; i <= n; i++)
{
scanf("%d", &t[i]);
t[i] -= ;
}
for (int i = ; i <= n; i++)
for (int j = ; j <= w; j++)
{
if (j % ) dp[i][j] = max(dp[i - ][j], dp[i - ][j - ]) + t[i];
else dp[i][j] = max(dp[i - ][j], dp[i - ][j - ]) + !t[i];
}
printf("%d\n", dp[n][w]);
}
最新文章
- Digital calculation
- Core Data数据操作
- 【maven】解决Missing artifact jdk.tools:jdk.tools:jar:1.6
- 逆天的IE7中,诡异的横向滚动条
- 一道sql面试题(查询语句)
- Docker进阶使用1
- SpringMVC框架(一)
- flask基础---第三篇
- java体系架构
- Flask从入门到精通
- laravel CSRF 保护
- 关于MySQL慢日志,你想知道的都在这
- web高并发的解决方案
- springboot系列十、springboot整合redis、多redis数据源配置
- Python Tutor
- (暴力+优化)学渣的逆袭 -- zzuli -- 1785
- wxml
- C语言 &#183; 彩票
- Bootstrap框架和inconfont、font-awesome使用
- PL/SQL 报错:动态执行表不可访问,本会话的自动统计被禁止。 在执行菜单里你可以禁止统计,或在v$session,v$sesstat 和vSstatname表里获得选择权限。
热门文章
- Mybatis 查询一个对象包含多个子对象 (List 包含 List)
- 《深入理解java虚拟机》笔记(8)类的加载机制
- 关于C#操作Excel,复制Sheet的记录
- Ubuntu下安装Yarm-PM2
- 基于JAVA的设计模式之单例模式
- Random类、ThreadLocalRandom类
- Spring 设计原则
- 切记切记:Spring配置文件中,Component-scan无法扫描到的类中的自动装配对象无法被调用,报空指针错误。
- 《超实用的Node.js代码段》连载二:正确拼接Buffer
- Oracle创建用户、表(1)