題意看了半天才懂,英語不好,真難為情嗄。。。
還是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個小時不能解決的問題,就是不會。