hdu1069 Monkey and Banana 還是DP

來源:互聯網
上載者:User

題意看了半天才懂,英語不好,真難為情嗄。。。

還是DP題,開始還以為是完全背包,再細看,發現只是一個block可以經過翻轉成為3個block。

題意:block從低向高嚴格遞減排序(兩個關鍵字的排序)。

DP前對資料進行小小的處理,排序。

詳見代碼:

#include <iostream>#include<algorithm>using namespace std;struct info{int x;int y;int z;}dp[100];int num[3];bool compare(struct info a,struct info b){if(a.x>b.x) return 1;else if(a.x==b.x&&a.y>b.y) return 1;else return 0;}int main(){int n;int i,k;int cnt=1;while(cin>>n&&n){k=0;for(i=0;i<n;i++){cin>>num[0]>>num[1]>>num[2];sort(num,num+3);//長寬高排個序dp[k].x=num[2];dp[k].y=num[1];dp[k].z=num[0];dp[k+1].x=num[2];dp[k+1].y=num[0];dp[k+1].z=num[1];dp[k+2].x=num[1];dp[k+2].y=num[0];dp[k+2].z=num[2];k+=3;}sort(dp,dp+k,compare);//整體排序,使dimension大的在下int j=0;int sum[100];sum[0]=dp[0].z;int Max=sum[0];//DP過程for(i=1;i<k;i++){sum[i]=dp[i].z;for(j=0;j<i;j++)if(dp[j].x>dp[i].x&&dp[j].y>dp[i].y){if (sum[j]+dp[i].z>sum[i]){sum[i]=sum[j]+dp[i].z;}}if(Max<sum[i]) Max=sum[i];//記錄最大值}cout<<"Case "<<cnt++<<": maximum height = "<<Max<<endl;}return 0;}

收穫:剛看到題,理解了題意後,用貪心寫,發現忽略了很多可行的block,後來特意推導DP的方程,很快找到。總之,覺得自己有進步,加油!!!吖颯。。

看題的時候盡量集中精神,要記得 比賽的時候 5個小時不能解決的問題,就是不會。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.