C题:A Water Problem(dp||搜索)

本文介绍了解决特定问题的两种算法策略:递归与动态规划。通过一个实例,详细展示了每种方法的实现过程,包括代码示例。递归方法通过函数自身调用解决子问题,而动态规划则通过保存子问题的解决方案避免重复计算,提高效率。

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

原题链接

解法一:递归

#include<cstdio>
#include<algorithm>
using namespace std;
long long n,x,y;
long long solve(int m)
{
    if(m==1) return x;
    if(m%2==1){
        long long t1=solve(m+1);
        long long t2=solve(m-1);
        long long t3=n*x;
        return min(t3,min(t1,t2)+x);
    }
    long long t1=solve(m/2)+y;
    long long t2=m*x;
    return min(t1,t2);
}
int main()
{
    while(scanf("%d%d%d",&n,&x,&y)!=EOF)
        printf("%lld\n",solve(n));
}

解法二:动态规划

#include<cstdio>
#include<algorithm>
using namespace std; 
const int maxn=1e7+10;
int n,x,y;
long long dp[maxn];
int main()
{
    while(~scanf("%d%d%d",&n,&x,&y)){
        dp[1]=x;
        for(int i=1;i<=n;i++){
            if(i%2) dp[i]=min(dp[i/2+1]+x+y,dp[i-1]+x);
            else dp[i]=min(dp[i/2]+y,dp[i-1]+x);
        }
        printf("%lld\n",dp[n]);    
    }
}

(动态规划就是省略了搜索过程中的一些重复搜索的内容,而直接找到前后待搜索关键字的状态转移关系,和记忆化搜索还是略有区别的,因为记忆化搜索只是剪枝,并没有找到它们之间的关系)

转载于:https://www.cnblogs.com/freinds/p/6544595.html

好的,以下是输出植树地图的完整代码: ```python tree_data = [ ['A', 14.8, 23.8, 18500, 8.0], ['G', 18.8, 28.1, 20800, 7.0], ['F', 24.1, 22.2, 31000, 6.2], ['C', 35.3, 19.9, 28000, 7.3], ['E', 16.5, 10.5, 15000, 4.2] ] # 计算每个树在地图上应该显示的半径 max_radius = max([t[4] for t in tree_data]) for t in tree_data: t.append(int(t[4] / max_radius * 10)) # 构建地图二维数组 map_data = [[' ' for i in range(71)] for j in range(21)] for t in tree_data: x, y, water, radius, display_radius = t[1:] row = int(y / 2) col = int(x * 2) for i in range(-display_radius, display_radius+1): for j in range(-display_radius, display_radius+1): if i**2 + j**2 <= radius**2: map_data[row+i][col+j] = t[0] # 输出地图 for i in range(20, -1, -1): row_str = 'S3: {:>2} + '.format(i*10) for j in range(71): row_str += map_data[i][j] + ' ' if j == 29: row_str += '+ ' print(row_str) col_str = 'S3: 0 ' for i in range(7): col_str += '{:>8}{:<8}'.format(i*10, i*10+10) print(col_str) ``` 解释一下代码: 1. 将树的数据设置为二维数组 `tree_data`,其中每个元素表示一棵树的信息,包括编号、x 坐标、y 坐标、所需水量和半径。 2. 计算每个树在地图上应该显示的半径,将其存储在 `display_radius` 中,并将所有 `display_radius` 中的最大值除以 10。 3. 构建地图二维数组 `map_data`,其中每个元素表示地图上对应位置的树的编号,如果该位置没有树则为空格。 4. 输出地图,首先输出每一行的坐标,并在第 30 列后加上一个 `+`,然后逐行输出地图上的树的位置。注意,由于 Python 中的二维数组是行优先存储的,因此在循环中对行和列的访问要倒过来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值