dp 矩形巢狀
阿新 • • 發佈:2019-01-14
設前面n-1個矩形巢狀最大值為x
則最後一個的值為x+1(能被巢狀)或x(不能被巢狀);
dp【i】表示第i個能被巢狀的最大值; 其實
需用sort 排序
全遍歷
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> #include<algorithm> #define ll long long using namespace std; struct stu{ ll x,y; }A[1000]; ll dp[1000]={0}; bool cmp(stu a1,stu a2) { if(a1.x==a2.x) return a1.y<a2.y; return a1.x<a2.x; } int main() { ll i,j,k,n; ll maxx=0; scanf("%lld",&n); for(i=0;i<n;i++) { scanf("%lld%lld",&A[i].x,&A[i].y); if(A[i].x<A[i].y) // x當長的; { ll temp=A[i].x; A[i].x =A[i].y; A[i].y=temp; } } sort(A,A+n,cmp); for(i=0;i<n;i++) { dp[i]=1; //第一層 預設 無法巢狀的值為1 for(j=0;j<i;j++) { if(A[i].x>A[j].x&&A[i].y>A[j].y) // 可以巢狀 dp[i]=max(dp[i],dp[j]+1); } } // 最後找dp陣列的最大值 ll zuida=0; for(i=0;i<n;i++) zuida=max(zuida,dp[i]);// 這種比較簡便 printf("%lld\n",zuida); return 0; }