UVA 111-History Granding

注:連不上UVA,尚未AC,因此僅做爲參考編程

動態規劃題,根據學生給的歷史事件的順序,與正確的歷史事件順序進行比較,找出其中最長的遞增序列,能夠參考編程之美中關於最長遞增序列的解答。在輸入測試數據的時候,處理一下數據。bash

輸入:第一行是正確的事件順序,接下來爲學生的答案markdown

10
3 1 2 4 9 5 10 6 8 7//意思是:1事項在第三個時間位置發生,2事項在第一個時間發生以此類推:轉化爲:2 3 1 4 6 8 10 9 5 7
1 2 3 4 5 6 7 8 9 10
4 7 2 3 10 6 9 1 5 8
3 1 2 4 9 5 10 6 8 7
2 10 1 3 8 4 9 5 7 6
複製代碼

輸出:依次輸出每一個case 的答案測試

代碼:
spa

#include <stdio.h>
#include <memory.h>

int count(int *cas,int letters_num){
    int lis[20],i,j,MAX=0;
    memset(lis,0,20*sizeof(int));
    for (i=0;i<letters_num;i++)//外層循環遍歷n遍
    {
        lis[i]=1;
        for (j=0;j<i;j++)//內層循環遍歷i遍
        {
            if (cas[i]>cas[j]&&lis[j]+1>lis[i])//知足動態規劃的條件,即前面的狀態不會影響到後面的狀態
            {
                lis[i]=lis[j]+1;
            }
        }
    }
    for(i=0;i<letters_num;i++){
        if (MAX<lis[i])
        {
            MAX=lis[i];
        }
    }
    return MAX;
}

int main(){
#ifdef TEST
    freopen("test.txt","r",stdin);
    freopen("tout.txt","w",stdout);
#endif
    int letters_num;
    int right_order[20];
    int cas[20];
    scanf("%d\n",&letters_num);
    int i=0,j=0,b,score;
    char a;
    for (i=0;i<letters_num;i++)
    {
        scanf("%d",&right_order[i]);
        getchar();
    }
    i=0;
    while(scanf("%d",&b)==1){
        for (j=0;j<letters_num;j++)
        {
            if (b==right_order[j])//找出該事件在正確順序中的位置
            {
                cas[i++]=j;
                break;
            }
        }
        a=getchar();
        if (a=='\n')
        {
            i=0;
            score=count(cas,letters_num);
            printf("%d\n",score);
        }
    }
    return 0;
}複製代碼
相關文章
相關標籤/搜索