糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 1989 The Cow Lineup 动态规划

思路:
如果之前出现过长度为 len 的子序列。假设该子序列出现在 [a, b] 之间。
那如果存在 1, 2, ... K 任意一个数字出现在 [a, b] 之间,则必然存在一个长度为 len + 1 的非子序列。

代码:
从后往前推。用的是链表。94ms AC。
速度一般,还是不知道那些 0ms 是怎么搞出来的。
有人说可以从前往后推,可能会快一点吧。

#include <stdio.h>

#define MAX_N 100032
#define MAX_K 10032

struct node {
    
int idx;
    
struct node *next;
}
;
struct node nodes[MAX_N], *pos[MAX_K];
int N, K, left;

int main()
{
    
int i, j, len;

    freopen(
"e:\\test\\in.txt""r", stdin);
    
    scanf(
"%d%d"&N, &K);
    
for (i = 0; i < N; i++{
        scanf(
"%d"&j);
        nodes[i].idx 
= i;
        nodes[i].next 
= pos[j];
        pos[j] 
= &nodes[i];
    }


    left 
= N + 1;
    
for (len = 1; len <= N; len++{
        j 
= left;
        
for (i = 1; i <= K; i++{
            
while (pos[i] && pos[i]->idx >= left)
                pos[i] 
= pos[i]->next;
            
if (!pos[i])
                
break;
            
if (pos[i]->idx < j)
                j 
= pos[i]->idx;
        }

        
if (i <= K)
            
break;
        left 
= j;
    }

    printf(
"%d\n", len);

    
return 0;
}

posted on 2010-03-14 15:46 糯米 阅读(446) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理