动态规划intermediate:UVa 10239

一开始看错题了,以为书是任意排列的,结果怎么样也搞不出状态方程……后来看了题解才发现顺序是固定的,这样这题就成水题了……

状态转移方程为:dp[cur]=min{dp[i]+max{h[j]|cur<=j<i}|cur<i<n}

为了避免精度问题,可以把浮点数转化为整数来做就行了。

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define M 1010
int n,W;
int h[M],w[M];
char str[M];
int dp[M];
int dfs(int cur)
{
    if(dp[cur]!=-1) return dp[cur];
    if(cur==n) return dp[cur]=0;
    int &ans=dp[cur];
    ans=1<<30;
    int mh=0,sum=0;
    for(int i=cur;i<n;i++)
    {
        sum+=w[i];
        mh=max(mh,h[i]);
        if(sum>W) break;
        ans=min(ans,dfs(i+1)+mh);
    }
    return ans;
}
int main()
{
    freopen("in.txt","r",stdin);
    while(gets(str)!=NULL&&str[0]!='0')
    {
        int a,b;
        sscanf(str,"%d %d.%d",&n,&a,&b);
        W=10000*a+b;
        for(int i=0;i<n;i++)
        {
            gets(str);
            int a1,b1,a2,b2;
            sscanf(str,"%d.%d %d.%d",&a1,&b1,&a2,&b2);
            h[i]=10000*a1+b1;
            w[i]=10000*a2+b2;
        }
        memset(dp,-1,sizeof(dp));
        printf("%.4f\n",(double)dfs(0)/10000);
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值