Dream City (第六屆ACM) (2011-3-16 10:21)

//之前純貪心算法做的,今天碰到一道類似的題目,發現了純貪心還不能做出這道題目。吸收了那道題目的正確答案之後,花了2分鐘,改成了這道題目的標準答案。


//貪心代碼:

#include<stdio.h>
struct NODE{
int a;
int b;
int c;
}tree[251];
int main()
{
int t,n,m,i,a,b,tm,tn,max,sum,ti;
scanf("%d",&t);
while(t--){
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        tree[i].a=a;
        tree[i].c=1;       
    }
    for(i=1;i<=n;i++){
        scanf("%d",&b);
        tree[i].b=b;
    }
    tm=m;
    tn=n;
    sum=0;
    while(tm-- && tn--){
        max=-1;ti=0;
        for(i=1;i<=n;i++){
            if(tree[i].c && tree[i].a+tm*tree[i].b>max){
                max=tree[i].a+tm*tree[i].b;
                ti=i;
            }
        }
        sum+=max;
        tree[ti].c=0;
    }
    printf("%d\n",sum);
}
return 0;
}


//貪心+DP代碼:

/*
首先根據bb的值從小到大排序,然後進行dp。dp[i][j]表示前i 個選擇j個的最大值
dp[i][j]=max( dp[i-1][j] , dp[i-1][j-1]+第j個選擇第i個的value )
*/
#include<stdio.h>
#define M 5001
struct NODE{
    int ll,bb;
}boy

­,temp;
int dp

­

­;
int max(int a,int b){
    return a>b?a:b;
}
int main()
{
    int n,k,t;
    int i,j,tmp,p;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&k);
        for(i=1;i<=n;i++) scanf("%d",&boy[i].ll);
        for(i=1;i<=n;i++) scanf("%d",&boy[i].bb);
       
        //排序   
        for(i=1;i<n;i++){
            p=i;
            for(j=i+1;j<=n;j++){
                if(boy[j].bb<boy[p].bb){
                    p=j;
                }
            }
            if(p!=j){
                temp=boy[p];boy[p]=boy[i];boy[i]=temp;
            }
        }   
        //初始化
        for(i=0;i<=n;i++)
            for(j=0;j<=n;j++)
            dp[i][j]=0;               
        //DP
        for(i=1;i<=n;i++){       
            for(j=1;j<=i && j<=k;j++){   
                if(i-1>=j)   
                    dp[i][j]=dp[i-1][j];
                tmp=boy[i].ll+boy[i].bb*(j-1);
                dp[i][j]=max(dp[i][j],dp[i-1][j-1]+tmp);
            }
        }   
        printf("%d\n",dp[n][k]);
    }   
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章