洛谷P3354 [IOI2005]Riv 河流——“承诺”DP

本文详细解析洛谷P3354题目中的伐木场问题,采用树形DP算法解决,通过记录状态承诺,实现相同承诺间的转移,最终求得最小成本。代码实现涉及点、伐木场个数、前伐木场及是否有伐木场的状态矩阵。

题目:https://www.luogu.org/problemnew/show/P3354

状态中要记录一个“承诺”,只需相同承诺之间相互转移即可;

然后就是树形DP的套路了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int n,m,head[105],ct,siz[105],fa[105],len[105];
ll ed[105],f[105][55][105][3];//点,伐木场个数,前伐木场,是否有伐木场 
ll a[105],c[105][105];//c:从i到j代价 
struct N{
    int to,next;
    ll w;
    N(int t=0,int n=0,ll w=0):to(t),next(n),w(w) {}
}edge[100005];
void init(int cr,int cnt,ll dis,int nw)
{
    c[cr][cnt]=dis*a[cr];
    if(cnt)f[cr][0][cnt][0]=c[cr][cnt];
    if(!nw)
    {
        len[cr]=cnt;return;
    }
    init(cr,cnt+1,dis+ed[nw],fa[nw]);
}
void dfs(int x)
{
    siz[x]=1;
    for(int j=1;j<=n;j++)f[x][j][0][1]=0;
    for(int k=1;k<=len[x];k++)f[x][1][k][1]=0;
    for(int i=head[x],v;i;i=edge[i].next)
    {
        dfs(v=edge[i].to);
        for(int j=min(m,siz[x]+siz[v]);j>=0;j--)
        {
            for(int k=0;k<=len[x];k++)
            {
                f[x][j][k][0]+=min(f[v][0][k+1][0],f[v][0][k+1][1]);
                f[x][j][k][1]+=min(f[v][0][1][0],f[v][0][1][1]);
                for(int l=max(1,j-siz[x]);l<=j&&l<=siz[v];l++)
                {
                    f[x][j][k][0]=min(f[x][j][k][0],f[x][j-l][k][0]+min(f[v][l][k+1][0],f[v][l][k+1][1]));
                    f[x][j][k][1]=min(f[x][j][k][1],f[x][j-l][k][1]+min(f[v][l][1][0],f[v][l][1][1]));
                }
            }
        }
        siz[x]+=siz[v];
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1,x;i<=n;i++)
    {
        scanf("%lld%d%lld",&a[i],&x,&ed[i]);
        edge[++ct]=N(i,head[x],ed[i]);head[x]=ct;
        fa[i]=x;
    }
    memset(f,1,sizeof f);f[0][0][0][0]=0;//!
    for(int i=1;i<=n;i++)init(i,0,0,i);
    dfs(0);
    printf("%lld",f[0][m][0][0]);
    return 0;
}

 

转载于:https://www.cnblogs.com/Zinn/p/9139344.html

先展示下效果 https://pan.quark.cn/s/5061241daffd 在使用Apache HttpClient库发起HTTP请求的过程中,有可能遇到`HttpClient`返回`response`为`null`的现象,这通常暗示着请求未能成功执行或部分资源未能得到妥善处理。 在本文中,我们将详细研究该问题的成因以及应对策略。 我们需要掌握`HttpClient`的运作机制。 `HttpClient`是一个功能强大的Java库,用于发送HTTP请求并接收响应。 它提供了丰富的API,能够处理多种HTTP方法(例如GET、POST等),支持重试机制、连接池管理以及自定义请求头等特性。 然而,一旦`response`对象为`null`,可能涉及以下几种情形:1. **连接故障**:网络连接未成功建立或在请求期间中断。 需要检查网络配置,确保服务器地址准确且可访问。 2. **超时配置**:若请求超时,`HttpClient`可能不会返回`response`。 应检查连接和读取超时设置,并根据实际需求进行适当调整。 3. **服务器故障**:服务器可能返回了错误状态码(如500内部服务器错误),`HttpClient`无法解析该响应。 建议查看服务器日志以获取更多详细信息。 4. **资源管理**:在某些情况下,如果请求的响应实体未被正确关闭,可能导致连接被提前释放,进而使后续的`response`对象为`null`。 在使用`HttpClient 3.x`版本时,必须手动调用`HttpMethod.releaseConnection()`来释放连接。 而在`HttpClient 4.x`及以上版本中,推荐采用`EntityUtils.consumeQuietly(respons...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值