拼多多笔试第4题
拼多多第4题, 考虑一个多步决策,每次剔除的是最长升序序列或者最长降序序列,利用回溯法(递归)求解。
测试了几个案例,都过了。大家指点指点
#include<iostream>
#include<vector>
using namespace std;
bool compare(int a, int b, int order=0) {
return order==0?a<b:a>b;// 0 ascending, 1 descending
}
vector<int> LIS(vector<int> sequence, int order=0) {
// dp
vector<int> dp(sequence.size(), 1);
vector<vector<int>> pos;
// initialize
for(int i=0; i<sequence.size(); i++) {
vector<int> tmp;
tmp.push_back(i);
pos.push_back(tmp);
}
for(int i=1; i<sequence.size(); i++) {
int idx=0;
for(int j=0; j<i; j++) {
if(compare(sequence[j], sequence[i], order)) {
if(dp[j]+1>dp[i]) {
dp[i] = dp[j]+1;
idx = j;
}
}
}
for(auto it: pos[idx]) {
pos[i].push_back(it);
}
}
int id=0;// find max sequence ending
int maxL=0;
for(int i=0;i<sequence.size(); i++) {
if(dp[i]>maxL) {
maxL = dp[i];
id = i;
}
}
// cout<<id<<endl;
// delete from list
int k = sequence.size()-maxL;
// cout<<"k: "<<k<<endl;
vector<int> res(k);
int j= 0;
for(int i=sequence.size()-1; i>=0; --i) {
if(i==pos[id][j]) ++j;
else {
res[k-1] = sequence[i];
--k;
}
}
return res;
}
void printVec(vector<int>& res) {
for(auto it: res) {
cout<<it<<" ";
}
cout<<endl;
}
int leastRound(vector<int> cards) {
if(cards.size()==0) return 0; // recursive end
/*
vector<int> res = LIS(cards, 0);
printVec(res);
res = LIS(cards, 1);
printVec(res);
return 0;
*/
return min(leastRound(LIS(cards, 0))+1,
leastRound(LIS(cards, 1))+1);
}
int main() {
vector<int> cards;
int n, num;
cin>>n;
while(n) {
cin>>num;
cards.push_back(num);
--n;
}
cout<<leastRound(cards)<<endl;
}
}#笔试题目##拼多多#
查看10道真题和解析