题意:
求大象从重量递增且智商递减的序列的最长,并打印最长序列
思路:
dp[cur]表示以cur为结尾的最长,很好理解
code:
#include<cstdio>
#include<cstring>
const int N = 10005;
struct state {
int w, s;
}tmp[N];
int n, dp[N], vis[N];
int find(int cur) {
if(dp[cur]) return dp[cur];
int a;
vis[cur] = cur;//起点
state& now = tmp[cur];
for(int i=0; i<n; i++) {
if(tmp[i].w<now.w && tmp[i].s>now.s) {
a = find(i);
if(dp[cur]<=a) {
dp[cur] = a;
vis[cur] = i;
}
}
}
return ++dp[cur];
}
void deal() {
int maxn=0, id=0;
int cnt = 0;
int ans[N];
for(int i=0; i<n; i++) {
if(!dp[i]) find(i);
if(maxn < dp[i]) {
maxn = dp[i];
id = i;
}
}
printf("%d\n", maxn);
while(id != vis[id]) {
ans[cnt++] = id+1;
id = vis[id];
}
ans[cnt++] = id+1;
for(int i=cnt-1; i>=0; i--) printf("%d\n", ans[i]);
}
int main() {
n = 0;
memset(tmp, 0, sizeof(tmp));
memset(vis, 0, sizeof(vis));
memset(dp, 0, sizeof(dp));
while(scanf("%d%d", &tmp[n].w, &tmp[n].s) == 2) n++;
deal();
return 0;
}