uva 10688 - The Poor Giant(区间dp)

本文详细介绍了如何使用区间动态规划(DP)解决UVA 10688 The Poor Giant问题。通过定义状态转移方程f(i,j),在给定的n个苹果和初始重量k的情况下,找到最小的吃苹果总重量来确定唯一的甜苹果。文章深入分析了题目的逻辑,提供了清晰的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目链接 uva-10688


题意

有n个苹果,和一个数k,第i个苹果的重量是k+i(1<=i<=n). 已知其中只有一个苹果是甜的,
所有比它重量轻的都是苦的,比它重的都是酸的。

为了要找出甜的苹果,就要去一个一个地吃它,且吃了咬了苹果就必须把它吃完,不管苹果是苦的还是酸的。
我们可以选择一个最佳策略,为了找到甜苹果吃总重量最少。
假设n=4, k=0,那么4个苹果的重量为1,2,3,4,假设先吃 #2个苹果,
如果#1是甜的,那么吃了2时就是酸的,那么就可以确定1是甜的了,共吃重量=2
如果#2是甜的,那么吃的重量=2
如果#3是甜的,那么2是酸的,可以推测甜的在(3,4)中的一个,然后吃3, 就可以确定哪个是甜的,共吃重量=2+3=5
如果#4是甜的,那么方案和上面一样,共吃重量=5
其实就类似二分法。
总共重量 = 2+2+5+5 = 14

(下面这一段原题题目描述有误,下面是正确的)
但这不是最佳方案,因为还可以有总重量更少的。

例如,先吃#1, 
如果#1是甜的,花费1
如果#2是甜的,那么选择吃#3,不管#3是什么味道,都可以推测出#2和#4的味道,那么花费1+3
如果#3是甜的,第二次选择吃#3, 共花费1+3 = 4
如果#5是甜的,方案和上面一样, 共花费1+3 = 4
总共1+4+4+4 = 13,这方案更好。

给出n和k,问最少的吃的总重量是多少?


思路

明显的区间dp,不过因为题目描述有错误的地方(也怪自己没仔细看),结果很久没搞懂题意。
f(i, j)表示第i个到第j个的最佳方案下的总重量。
对于f(i, j),可以选择i~j之间的其中一个mid先吃,然后确定mid的左右区间(i, mid-1)和(mid+1, j)的区间。
如果先吃了mid,那么确定左右区间的每一个苹果,都要增加第mid个苹果的重量,所以:
f(i, j) = min{ f(i, mid-1)+f(mid+1, j) + weight[mid]*(j-i+1) | i<=mid<=j}



代码

/**=====================================================
 *   This is a solution for ACM/ICPC problem
 *
 *   @source      : uva-10688 The Poor Giant
 *   @description : 区间dp
 *   @author      : shuangde
 *   @blog        : blog.youkuaiyun.com/shuangde800
 *   @email       : zengshuangde@gmail.com
 *   Copyright (C) 2013/09/13 12:23 All rights reserved. 
 *======================================================*/

#include 
  
   
#include 
   
    
#include 
    
     
#include 
     
      
#include 
      
       
#define MP make_pair
using namespace std;

typedef pair
       
        PII; typedef long long int64; const double PI = acos(-1.0); const int INF = 0x3f3f3f3f; const int MAXN = 610; int f[MAXN][MAXN]; int val[MAXN]; int n, k; int main(){ int nCase, cas=1; scanf("%d", &nCase); while (nCase--) { scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) val[i] = k + i; memset(f, 0, sizeof(f)); for (int d = 2; d <= n; ++d) { for (int l = 1; l + d -1 <= n; ++l) { int r = l + d - 1; int& ans = f[l][r] = INF; for (int mid = l; mid <= r; ++mid) { ans = min(ans, f[l][mid-1] + val[mid] * d + f[mid+1][r]); } } } printf("Case %d: %d\n", cas++, f[1][n]); } return 0; } 
       
      
     
    
   
  

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
### Vue.js Giant Tree Library or Component Implementation Vue.js 是一种流行的前端框架,用于构建交互式的用户界面。关于 `vue-giant-tree` 的具体实现或者库的相关信息,在现有的资料中并没有直接提及名为 `vue-giant-tree` 的官方组件或插件[^1]。 然而,可以推测该需求可能涉及处理大规模树形结构数据的场景。在这种情况下,开发者通常会寻找支持高性能渲染和优化功能的第三方库来满足这一需求。以下是几个常见的解决方案: #### 一、已知的树形组件库 1. **Element Plus**: Element Plus 提供了一个内置的 `<el-tree>` 组件,能够很好地适配中小型规模的数据展示需求。对于大型树状结构,可以通过虚拟滚动技术进一步提升性能[^2]。 ```javascript import { ElTree } from 'element-plus'; ``` 2. **Ant Design Vue**: Ant Design Vue 中也提供了类似的树控件 (`<a-tree>`) ,它具有丰富的 API 和事件绑定机制,适用于复杂业务逻辑下的操作[^3]。 3. **vue-virtual-scroller**: 如果目标是管理极其庞大的节点集合,则推荐考虑引入专门针对列表/网格项懒加载设计的工具——比如 `vue-virtual-scroller` 。通过仅渲染可见区域内的项目从而显著减少内存占用并加快页面响应速度[^4]。 #### 二、自定义开发建议 当现有开源选项无法完全匹配特定应用场景时,也可以尝试自行编写适合自己的巨型树组件。主要思路如下所示: - 利用分页策略限制每次请求返回的结果数量; - 借助按需加载子节点的方式延迟初始化不必要的部分; - 结合 CSS 动画效果增强用户体验流畅度; ```html <!-- 示例代码片段 --> <div id="app"> <tree :data="treeData"></tree> </div> <script> export default { data() { return { treeData: [] // 初始化为空数组等待异步填充实际内容 }; }, methods:{ fetchNode(node){ axios.get(`/api/tree/${node.id}`) .then(response => node.children = response.data); } } } </script> ``` 上述方法展示了如何动态获取某个父级下面的所有后代记录,并将其赋值给对应位置上的 children 属性以便视图层自动更新显示出来[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值