原题:
题目意思:
就是说,给你一个卡片的长度和宽度,然后再给你许多信封的大小,包括长度和宽度,然后信封的长度和宽度都要大于卡片的长度和宽度,然后就是寄出每个信封时,信封的大小也是要逐步递增的,然后就是要你考虑,最多能寄出多少封信
题目分析:
DP题,然后就是建立一个数组,来存储每个信封它之后能有多少个信封被容纳,也就是小于该信封,包括长宽,但是要大于卡片的大小,然后再输出这个序列就可以了
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Envelope{
int height;
int width;
};
Envelope enList[5010];
int result[5010];
int ppp = 0;
int resultIndex[5010];
int envelopeNum = 0;
int cardHeight = 0;
int cardWidth = 0;
int maxNum = 0;
int maxIndex = 0;
int getP(int m) {
if(result[m]>0 || result[m] == -1) return result[m];
if(enList[m].height>cardHeight && enList[m].width>cardWidth) result[m] = 1;
else return -1;
for (int i=1;i<=envelopeNum;i++) {
if(i != m && enList[m].height>enList[i].height && enList[m].width>enList[i].width) {
int op = getP(i) + 1;
result[m] = max(result[m],op);
}
}
if(maxNum<result[m]) {
maxNum = result[m];
maxIndex = m;
}
return result[m];
}
bool large(Envelope p1,Envelope p2) {
if(p1.height>p2.height && p1.width>p2.width) return true;
return false;
}
void print_s(int index){
resultIndex[--ppp] = index;
for (int i=1;i<=envelopeNum;i++) {
if(result[index] == result[i]+1 && large(enList[index],enList[i])) print_s(i);
}
}
int main(){
while(cin>>envelopeNum>>cardWidth>>cardHeight) {
memset(result,0,sizeof(result));
memset(resultIndex,0,sizeof(resultIndex));
maxNum = 0;
maxIndex = 0;
for (int i=1;i<=envelopeNum;i++) {
cin>>enList[i].width>>enList[i].height;
}
for (int i=1;i<=envelopeNum;i++) if(result[i] == 0) getP(i);
// cout<<"------ 1 -------"<<endl;
// for (int i=1;i<=envelopeNum;i++) cout<<result[i]<<" ";
// cout<<"------ 1 -------"<<endl;
cout<<maxNum<<endl;
if(!maxNum) continue;
// cout<<maxIndex<<endl;
ppp = maxNum;
print_s(maxIndex);
for (int i=0;i<maxNum;i++) {
if(i==0) cout<<resultIndex[0];
else cout<<" "<<resultIndex[i];
}
cout<<endl;
}
return 0;
}
疑惑:
好的吧,其实代码没有AC,死在了第13组测试数据上了,我也不知道为什么,算法的应该是没错的,就是不知道细节是哪里错了,真是坑,求大神看到,帮忙分析下