SCOJ 3843 ZUMA[기억 화 검색,dp]

1642 단어 dp
4.567915.SCOJ 3843 ZUMA 대의:100 가지 다른 색상 이 있 고 번 호 는 1,2,3 입 니 다.100.그 중에서 n 개의 구슬 을 직선 으로 배열 하여 특정한 구슬 을 특정한 위치 에 삽입 하 는 것 을 알 고 있 습 니 다.만약 에 이 구슬 과 연속 되 는 같은 색깔 의 구슬 갯 수>=k 라면 이 같은 색깔 의 구슬 을 모두 없 앨 수 있 습 니 다.현재 모든 구슬 을 없 애 려 면 적어도 몇 개의 구슬 이 필요 하 냐 고 물 었 습 니 다.
분석:기억 화 검색,,,,언어 조직 력 이 너무 나 빠 서 잘 모 르 겠 어 요...멘 붕 o(╯□╰)o
#include<stdio.h>

#include<string.h>



const int MAXN = 100+5;

const int K = 5+1;

int n,k;

int a[MAXN];

int dp[MAXN][MAXN][K];//dp[l][r][cnt];//    l r, l    cnt     l            

inline int min(int a,int b)

{

    return a<b?a:b;

}

int solve(int left,int right,int cnt)//   left     cnt a[left]    ,   right          

{

    int &cur = dp[left][right][cnt];//  cur     

    if(cur!=-1)return cur;

    if(left==right)

    {

        cur = k-cnt-1;

        return cur;

    }

    if(left>right)

    {

        cur = 0;

        return cur;

    }



    if(cnt<k-1)

        cur = solve(left,right,cnt+1)+1;

    else

        if(cnt>=k-1)//     k-1     a[left]  ,    

            cur = solve(left+1,right,0);

    int i;

    for(i=left+1;i<=right;i++)

    {

        if(a[i]!=a[left])continue;

        int value = solve(left+1,i-1,0)+solve(i,right,min(cnt+1,k-1));//   left,i

        if(value<cur)cur = value;

    }

    return cur;

}

int main()

{

    while(scanf("%d%d",&n,&k)!=EOF)

    {

        memset(dp,-1,sizeof(dp));

        int i;

        for(i=0;i<n;i++)

        {

            scanf("%d",&a[i]);

        }

        printf("%d
",solve(0,n-1,0)); } return 0; }

좋은 웹페이지 즐겨찾기