Пример #1
0
Файл: 1836.c Проект: jflyup/POJ
int main()
{
	int size;
 	scanf("%d", &size);
 	float * heights = (float*)malloc(size * sizeof(float));
 
 	int i;
 	for(i = 0; i < size; ++i)
 	{
 		scanf("%f", &heights[i]);
 	}
 
	int * asc = (int*)malloc(size * sizeof(int));
	LIS(heights, size, asc);

	float * reverse_heights= (float*)malloc(size * sizeof(float));

	for(i = 0; i < size; ++i)
	{
		reverse_heights[i] = heights[size - 1 - i];
	}

	int * desc = (int*)malloc(size * sizeof(int));
	LIS(reverse_heights, size, desc);

	//for(i = 0; i < size; ++i)
	//{
	//	printf("%d\t", asc[i]);
	//}
	//printf("\n");
	//for(i = 0; i < size; ++i)
	//{
	//	printf("%d\t", desc[i]);
	//}
	//printf("\n");

	int max = INT_MIN;
	int j;
	for(i = 0; i < size - 1; ++i)
	{
		for(j = size - 2 - i; j >= 0; --j)
		{
			if(asc[i] + desc[j] > max)
			{
				max = asc[i] + desc[j];
			}
		}
	}

 	printf("%d\n", size - max);

	free(asc);
	free(desc);
	free(heights);
	free(reverse_heights);
 	return 0;
 }
Пример #2
0
int main(void) {
	int n;
	scanf("%d", &n);
	int array[MAX_LEN];
	for (int i = 0; i < n; i++) {
		scanf("%d", &array[i]);
	}
	node dp[MAX_LEN];
	for (int i = 0; i < n; i++)
		dp[i].length = 1;

	LIS(array, dp, n);
	int max = dp[0].length;
	for (int i = 1; i < n; i++) {
		if (max < dp[i].length) {
			max=dp[i].length;
		}
	}
	for (int i = 0; i < n; i++) {
		if (dp[i].length == max) {
			for (int j = 0; j < max; j++) {
				printf("%d ", dp[i].a[j]);
			}
			printf("\n");
		}
	}

}
int main()
{
    int n, i, missle[N], lis[N];
    char str[10];
    bool first = true;

    scanf("%d", &n);
    getchar();
    getchar();

    while (n--)
    {
        if (first)
            first = false;
        else
            putchar('\n');
        i = 0;
        while (gets(str) && str[0])
            missle[i++] = getNum(str);

        int len = LIS(missle, i, lis);
        printf("Max hits: %d\n", len);
        for (i = 0; i < len; i++)
            printf("%d\n", lis[i]);
    }

    return 0;
}
int main()
{
    int n, dim, temp[10], i;
    Box box[N];

    while (scanf("%d%d", &n, &dim) != EOF)
    {
        int lis[N] = {};
        for (int k = 0; k < n; k++)
        {
            box[k].D = dim;
            box[k].tag = k + 1;//第0個盒子編號是1
            for (i = 0; i < dim; i++)
                scanf("%d", &box[k].dim[i]);

            //將各維度由小到大排序
            std::sort(box[k].dim, box[k].dim + dim);

        }
        //將箱子由小排到大
        std::sort(box, box + n, comp);

        int len = LIS(box, n, lis);
        //output
        printf("%d\n", len);
        for (i = 0; i < len - 1; i++)
            printf("%d ", lis[i]);
        printf("%d\n", lis[i]);
    }

    return 0;
}
Пример #5
0
int main()
{
    int ar[]={10,22,9,33,21,50,41,60,80};
    int n=sizeof(ar)/sizeof(ar[0]);
    printf("lIS length is %d",LIS(ar,n));
    return 0;
}
int main(int argc, char *argv[])
{
    int a[] = { 10, 22, 9, 33, 21, 50, 41, 60 };
    int size = sizeof(a)/sizeof(a[0]);
    printf("Longest Increasing Subsequence = %d\n",LIS(a,size));

}
void LISmain(void){
    int nums[] = //{1,2,3,4,5,5,3,2,5,6,7,4};
    //{35, 36, 39, 3, 15, 27, 6, 42};
    //{5, 4, 3, 2, 1};
    {1, -1, 2, -2, 0, 1, 1};
    int len = sizeof(nums)/sizeof(nums[0]);
    printf("%d\n", LIS(nums, len));
}
Пример #8
0
int main()
{
    int arr[] = {1,-1,2,-3,4,-5,6,-7 };
    printf("%d\n", LIS(arr,sizeof(arr)/sizeof(int)));
    outputLIS( arr, sizeof(arr) / sizeof(int) - 1);
    printf("\n");
    return 0;
}
Пример #9
0
int main()
{
	int n;
	while (scanf("%d", &n)!=EOF)
	{
		BuildSeqAndInitDP(n);
		printf("%d\n", LIS(n));
	}
	return 0;
}
Пример #10
0
 void Assembler::asm_li(Register r, int32_t imm) {
 #if !PEDANTIC
     if (isS16(imm)) {
         LI(r, imm);
         return;
     }
     if ((imm & 0xffff) == 0) {
         imm = uint32_t(imm) >> 16;
         LIS(r, imm);
         return;
     }
Пример #11
0
int main()
{
    int size;
    scanf("%d", &size);
    int *sequence = (int*)malloc(sizeof(int) * size);
    int i;
    for(i = 0; i < size; ++i)
        scanf("%d", &sequence[i]);
    printf("%d\n", LIS(sequence, size) );
    free(sequence);
    return 0;
}
/**
 Index value of longest increasing subsequence in O(n^2) - Recursively with dp apporoach.
 Ultimately this recursive approach is not better than iterative as
 all sub problems are revisited.
 **/
int LIS(int i) {
    if(i == 0) return 1;
    if (dp[i] != -1) {
        return dp[i];
    }
    int ans = 1;
    for(int j = 0; j < i; j++) {
        if (x[i] > x[j]) {
            ans = max(ans, 1 + LIS(j));
        }
    }
    return dp[i] = ans;
}
int main(int argc, char *argv[])
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&a[i]);
        }
        printf("%d\n", LIS());
    }
    return 0;
}
int main(){

    int *a,i, elem;

    printf("Enter no of elements\n");
    scanf("%d", &elem);

    a = (int*)malloc(sizeof(int)*elem);
    printf("Enter elements\n");

    for(i=0;i<elem;i++){
        scanf("%d", &a[i]);
    }

    printf("Longest Decresing Subsequence=%d\n", LIS(a, elem));

    return 0;
}
Пример #15
0
 bool increasingTriplet(vector<int>& nums) {
     return LIS(nums) >= 3;
 }
Пример #16
0
//Seja S o conjunto de todas las sequencias dos n primeiros números naturais.
//Defina R(s), com s \in S o conjunto de todas as sequencias que podem
//ser geradas rotacionando S.
//Defina LIS(s) e LDS(s) como você sabe e sejam |LIS(s)| e |LDS(s)| suas
//cardinalidades.
//Determinar Max_{s \in S}(Min_{s' \in R(s)}(Min(|LIS(s)|, |LDS(s)|)))
int main(int argc, char* argv[]){
	char* vector;
	char* vecRotation;
	
	int length = atoi(argv[1]);
	//	int lR_expected = atoi(argv[2]);
	int num_expected = 0;
	clock_t start,end;
	
	vector = (char*) malloc(length);
	vecRotation = (char*) malloc(length);

	start = clock();
	

	unsigned int lmaxS = 0;
	//Length -1 porque devido a rotação pode sempre deixar o primeiro número fixo, e alternar os seguintes
	//Dividido por 2, porque a inversão cobre metade do conjunto.
	unsigned long long counter = fatorial(length-1)/2;
	unsigned long long index = 0;
    //Cada loop gera um conjunto de sequências. Elementos de S. Cada elemento possui um conjunto de R sequencias.

	unsigned int lLIS, lLDS;
	while(counter > index){
		index++;
		counter--;
		getSequence(vector, length, index);
		//printf("%llu --> ", index);
		//printVector(vector, length);
		unsigned int lminR = length;	
		
		lminR = LIS(vector, length);

		if(lminR <= lmaxS)
			continue;

		lLDS = LDS(vector, length);
		

		if(lLDS < lminR)
			lminR = lLDS;

		if(lLDS <= lmaxS)
			continue;

		memcpy(vecRotation,vector,length);
		int i;
		for(i = 0; i < length-1; i++){
			rotation(vecRotation, length);

			lLIS = LIS(vecRotation, length);

			if(lLIS < lminR)
				lminR = lLIS;

			if(lLIS <= lmaxS)
				break;

			lLDS = LDS(vecRotation, length);
			
			if(lLDS < lminR)
				lminR = lLDS;

			if(lLDS <= lmaxS)
				break;			
		}
		
		//Define o maior valor encontrado entre os elementos de S
		if(lmaxS < lminR){
			lmaxS = lminR;
		}
	}
	end = clock();
	
	printf("%d -> Tempo: %f s\n",length, (float)(end-start)/CLOCKS_PER_SEC);
	printf("Lmax S = %d\n",lmaxS);
	free(vector);
	free(vecRotation);
}
Пример #17
0
void work(){
	LIS();
	int res=0;
	for(int i=1;i<=n;i++) res=max(res,f[i]);
	printf("%d\n",res);
}