結果用ACM481的方法去解竟然WA,囧rz。
用正常O(n ^ 2)解就AC……大概是我方法哪裡不對吧,
然後ACM481剛剛好AC……無解!
/* ACM 497 Strategic Defense Initiative
* mythnc
* 2012/01/16 20:42:20
* run time: 0.016
*/
#include <stdio.h>
#define MAXN 100000
#define LINEMAX 50
void input(void);
void lis(void);
int n;
int seq[MAXN], len[MAXN], pre[MAXN];
int main(void)
{
int set, i;
scanf("%d", &set);
getchar();
getchar();
for (i = 0; i < set; i++) {
input();
if (i > 0)
putchar('\n');
lis();
}
return 0;
}
/* input: receive input data */
void input(void)
{
char line[LINEMAX];
n = 0;
while (fgets(line, LINEMAX, stdin) && line[0] != '\n')
sscanf(line, "%d", &seq[n++]);
}
/* lis: find lis and output */
void lis(void)
{
int i, j, maxi;
int out[MAXN];
/* init */
for (i = 0; i < n; i++) {
len[i] = 1;
pre[i] = -1;
}
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
if (seq[j] > seq[i] && len[j] < len[i] + 1) {
len[j] = len[i] + 1;
pre[j] = i;
}
for (i = 1, maxi = 0; i < n; i++)
if (len[i] > len[maxi])
maxi = i;
/* output */
printf("Max hits: %d\n", len[maxi]);
i = 0;
while (1) {
out[i++] = seq[maxi];
if (pre[maxi] == -1)
break;
maxi = pre[maxi];
}
for (j = i - 1; j > -1; j--)
printf("%d\n", out[j]);
}
沒有留言:
張貼留言