设为首页 加入收藏

TOP

HDU4570----Multi-bit Trie----简单的DP
2014-11-23 19:48:34 来源: 作者: 【 】 浏览:3
Tags:HDU4570----Multi-bit Trie---- 简单

题目意思:

给你N个数

要你分成多段,每段长度不能超过20

是的sum(ai*(2^bi))最小,ai为每段第一个数,bi为长度

解题思路:

设dp[i] = min(dp[i],dp[j]+a[i]*2^(j-i)),1<=i<=n,i+1<=j<=min(i+20,n+1)

dp[i]表示以第i个作为总的开头的值

最后就dp[1]以及分成n段的一个比较

网上的代码很多,我写了一个迭代的,速度上要比记忆化搜索快一些

#include   
#include   
#include   
#include   
#include   
using namespace std;  
  
#define ULL long long   
  
const int maxn = 65;  
  
ULL dp[maxn];  
ULL a[maxn];  
int n;  
  
int main()  
{  
    int t;  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%d",&n);  
        ULL ans=0;  
        for(int i=1;i<=n;i++)  
        {  
            cin>>a[i];  
            ans += a[i]*2;  
        }  
  
        dp[n] = a[n]*2;  
        dp[n+1] = 0;  
        for(int i=n-1;i>=1;i--)  
        {  
            dp[i] = (1ULL<<62-1);  
            for(int j=i+1;j<=min(i+20,n+1);j++)  
            {  
                dp[i] = min(dp[i],dp[j]+a[i]*(1<<(j-i)));  
            }  
        }  
  
        cout< 
 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu1863 畅通工程(最小生成树之pr.. 下一篇UVA10026

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·求navicat for mysql (2025-12-26 13:21:33)
·有哪位大哥推荐一下m (2025-12-26 13:21:30)
·MySQL下载与安装教程 (2025-12-26 13:21:26)
·Linux_百度百科 (2025-12-26 12:51:52)
·Shell 流程控制 | 菜 (2025-12-26 12:51:49)