poj 3253Fence Repair--动态规划

来源:互联网 发布:算法的时间复杂度是指 编辑:程序博客网 时间:2024/06/04 19:10

问题描述:需要N个planks of woods,有Li个长度,农民John购买了一个无限长的木棍,要从木棍上砍下,N个Li的木棍,比如21 Length needs of 21cents.

输入:

3

8

5

输出:

34

分析:1,2,4,5

1+2=3;3+4=7;5+7=12;分析:首先选择两个最小的相加得到一个数和a,将a加入到剩余的队列中,继续排序,然后再找两个最小的,再求和....

比如:

567  345  690  841  1278

567+345=912; 排序:690  841   912   1278

690+841=1531;排序: 912    1278    1531

912+1278=2190;排序:1531   2190

1531+2190=3721

3721+2170+1531+1278+912=8354;

思路:贪心+哈弗曼树,用常规的方法来分析

1、首先读取n个数 ,进行排序;2、对前两个数相加,得到sum,然后对sum ,i+2,i+3,...,n排序

for(int i=1;i<=n-1;i++)

  { 

       for(int j=i+2;j<=n;j++)

               {  if(sum>a[i])

                        {  

                                w[j-1]=w[j];

                                if(j==n)

                                   {

                                       w[j]=sum;

                                        break

                                 }

                          }

                    else

                   { w[j-1]=sum; break;}

                }



}

          







#include<iostream>#include<stdio.h>using namespace std;int cmp(const void* a,const void* b){return *(int*)a-*(int*)b;}int main(){   int n;   while(scanf("%d",&n)!=EOF)   {       __int64 *a=new __int64[n+1];       for(int i=1;i<=n;i++)          scanf("%I64d",&a[i]);       qsort(a,n+1,sizeof(__int64),cmp);        __int64 mincost=0;        for(int i=1;i<=n-1;i++)        {            __int64 sum=a[i]+a[i+1];             mincost+=sum;            for(int j=i+2;j<=n;j++)           {             if(sum>a[j])             {                  a[j-1]=a[j];                  if(j==n)                   {                      a[j]=sum;                      break;                    }               }              else                {                    a[j-1]=sum;                    break;                }            }         }        printf("%I64d\n",mincost);     }    return 0;}


0 0