• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0

            問題描述

            烏拉爾大學的校長打算舉行建校80周年的晚會。大學的職員是分等級的,也就是說,職員之間的上下級關系組成了一棵以校長為根的樹。職員用1n之間的整數編號,人事處給出了每個職員的搞笑指數。為了使晚會的每個參加者都高興,校長不會同時邀請一個職員和他的頂頭上司。

            你的任務是給出一個客人的列表,使得客人的搞笑指數之和最大。

            輸入:

            第一行是一個整數n1<=n<=6000)。下面的n行每行是相應職員的搞笑指數。這個數的范圍是-128127。下面是職員的關系數。每行的格式是:<L><K>,意思是第K個職員是第L個職員的頂頭上司。輸入以0 0結束。

            輸出:

            最大的搞笑指數之和。

             

            此題個人感覺較“計算機網絡”更加簡單,遞推式更容易寫出。以d[i][0]表示第i個職員不參加,則以i為根的樹可以獲得的最大搞笑指數;以d[i][1]表示第i個職員參加,則以i為根的樹可以獲得的最大搞笑指數。

            題目意思即使i若參加,則i的兒子都不參見;若i不參加,i的兒子可參加也可不參加。這樣一來遞推式很容易寫出。

            d[i][0]=sum{ max(d[son(i)][0],d[son(i)][1]) };

            d[i][1]=fun[i]+sum{ d[son(i)][0] };

            此題中還有一個問題,就是關系樹中根的不確定。用father[i]=j表示i的父親為j,則father[i]==0的結點為根節點。(一開始沒有注意到,以為根節點是1號結點,結果樣例都過不去……)

             

             

            以下是我的代碼:

            #include<stdio.h>
            #define size 6001
            #define max(a,b) (a>b?a:b)
            typedef 
            struct NODE
            {
                
            long data;
                
            struct NODE *next;
            }
            node;
            node 
            *son[size];
            long n,root,fun[size]={0},father[size]={0},d[size][2]={0};
            node
            * newnode()
            {
                node 
            *p;
                p
            =(node*)malloc(sizeof(node));
                p
            ->data=0;
                p
            ->next=NULL;
                
            return p;
            }

            void insert(struct NODE *link,long x)
            {// x is link's Son
               node *p;
                p
            =newnode();
                p
            ->data=x;
                p
            ->next=link->next;
                link
            ->next=p;
            }

            void init()
            {
                FILE 
            *fin=fopen("year.in","r");
                
            long i,L,K;
                fscanf(fin,
            "%ld",&n);
                
            for(i=1;i<=n;i++)
                  son[i]
            =newnode();
                
            for(i=1;i<=n;i++)
                  fscanf(fin,
            "%ld",&fun[i]);
                fscanf(fin,
            "%ld%ld",&L,&K);
                
            while(L!=0||K!=0)
                
            {
                   
            // L is K's Son,K is L's Father
                   father[L]=K;
                   insert(son[K],L);
                   fscanf(fin,
            "%ld%ld",&L,&K);
                }

                fclose(fin);
            }

            void findroot()
            {
                
            long i;
                
            for(i=1;i<=n;i++)
                  
            if(father[i]==0)
                    
            break;
                root
            =i;
            }

            void dp(long k)
            {
                
            long i;
                node 
            *p;
                p
            =son[k]->next;
                
            if(p==NULL)
                  d[k][
            1]=fun[k];
                
            else
                
            {
                   
            while(p!=NULL)
                   
            {
                      dp(p
            ->data);
                      d[k][
            0]+=max(d[p->data][0],d[p->data][1]);
                      d[k][
            1]+=d[p->data][0];
                      p
            =p->next;
                   }

                   d[k][
            1]+=fun[k];
                }

            }

            void write()
            {
                FILE 
            *fout=fopen("year.out","w");
                
            long i,ans;
                ans
            =max(d[root][0],d[root][1]);
              fprintf(fout,
            "%ld\n",ans);
                fclose(fout);
            }

            int main()
            {
                init();
                findroot();
                dp(root);
                write();
            return 0;
            }

            posted on 2010-01-06 19:29 lee1r 閱讀(368) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:動態規劃
            久久无码人妻一区二区三区 | 一极黄色视频久久网站| 日本精品久久久中文字幕| 香港aa三级久久三级| 欧美性猛交xxxx免费看久久久| 97精品伊人久久大香线蕉| 久久久免费精品re6| 久久99精品久久久久久秒播| 久久久久亚洲av成人网人人软件| 97久久超碰国产精品2021| 久久精品无码一区二区三区日韩| 亚洲国产精品久久电影欧美| 青青青伊人色综合久久| 久久中文字幕人妻熟av女| 91久久精品国产91性色也| 蜜桃麻豆www久久国产精品| 久久久噜噜噜久久熟女AA片| 久久久久国产一区二区三区| 久久精品国产91久久综合麻豆自制| 久久伊人亚洲AV无码网站| 国产美女久久久| 亚洲日韩中文无码久久| 香蕉aa三级久久毛片| 国产精品99久久精品爆乳| 亚洲国产另类久久久精品| 久久有码中文字幕| 日本精品久久久中文字幕| 99久久国产热无码精品免费| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 四虎国产精品成人免费久久| 国产精品成人精品久久久 | 国内精品久久久久久野外| 成人午夜精品无码区久久| 性做久久久久久久久老女人| 国产精品九九久久免费视频 | 777午夜精品久久av蜜臀 | 久久久久久久综合日本| 国产精品欧美亚洲韩国日本久久 | 国产精品99久久久精品无码| 久久天天躁夜夜躁狠狠躁2022| 日韩欧美亚洲国产精品字幕久久久|