NYOJ 16 矩形嵌套(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 16 矩形嵌套(动态规划)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
矩形嵌套
時(shí)間限制:3000?ms ?|? 內(nèi)存限制:65535?KB 難度:4 描述每組測(cè)試數(shù)據(jù)的第一行是一個(gè)正正數(shù)n,表示該組測(cè)試數(shù)據(jù)中含有矩形的個(gè)數(shù)(n<=1000)
隨后的n行,每行有兩個(gè)數(shù)a,b(0<a,b<100),表示矩形的長(zhǎng)和寬
樣例輸出
5
第一種方法:
#include<cstdio> #include<string.h> #include<vector> #include<algorithm> #define N 1005 using namespace std; vector<int> vec[N]; int dp[N]; struct rec {int l,w; }a[N]; int nest(rec a1,rec a2) /*判斷兩個(gè)矩形是否可以嵌套*/ {if((a1.l>a2.l&&a1.w>a2.w)||(a1.l>a2.w&&a1.w>a2.l))return 1;return 0; } int dfs(int x,int n) {if(dp[x]!=-1)return dp[x];int maxv=0,flag=0;for(int i=0;i<vec[x].size();i++){flag=1;maxv=maxv>(dfs(vec[x][i],n)+1)?maxv:dfs(vec[x][i],n)+1;}if(!flag)return dp[x]=1;return dp[x]=maxv; } int main() {int t,n,i;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=0;i<n;i++)scanf("%d%d",&a[i].l,&a[i].w);memset(vec,0,sizeof(vec));for(i=0;i<n;i++)for(int j=0;j<n;j++){if(i==j)continue;if(nest(a[i],a[j])) /*如果i可以嵌套j*/vec[i].push_back(j);}memset(dp,-1,sizeof(dp));int maxv=0;for(i=0;i<n;i++){if(dp[i]==-1)dfs(i,n);maxv=maxv>dp[i]?maxv:dp[i];}printf("%d\n",maxv);}return 0; }
第二種方法:
#include<stdio.h> #include<algorithm> using namespace std; #define N 1005 struct rec {int l;int w; }a[N]; int dp[N]; bool comp(rec a1,rec a2) /*按長(zhǎng)從小到大排序*/ {if(a1.l==a2.l) return a1.w<a2.w;return a1.l<a2.l; } int main() {int t,i,n;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=0;i<n;i++){scanf("%d%d",&a[i].l,&a[i].w);if(a[i].l<a[i].w) /*保證長(zhǎng)比寬大*/{int temp=a[i].l;a[i].l=a[i].w;a[i].w=temp;}}sort(a,a+n,comp);int maxv=0;for(i=0;i<n;i++) /*求以i為終點(diǎn)最多嵌套幾個(gè)*/{dp[i]=1;for(int j=0;j<i;j++){if((a[j].l<a[i].l)&&(a[j].w<a[i].w)) /*若可以嵌套*/if(dp[i]<dp[j]+1)dp[i]=dp[j]+1;}if(maxv<dp[i])maxv=dp[i];}printf("%d\n",maxv);}return 0; }
總結(jié)
以上是生活随笔為你收集整理的NYOJ 16 矩形嵌套(动态规划)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NYOJ 496 巡回赛 拓扑排序
- 下一篇: 浅谈 Kubernetes 服务发现