Halloween Costumes LightOJ - 1422(只有代碼)

dp[i][j]表示第i天到第j天達到的最小值;
因爲前面某一天的選擇對後面會造成影響,對於這樣的問題,我們從後往前dp;
轉移方程:
(1) 第i天和[i+1,j]天裏的衣服都不同,dp[i][j]=dp[i+1][j]+1;2) 第i天和第k天,i+1<=k<=j,存在相同的,那麼如果第i天的衣服留下,第k天就可以不加新衣服了,
此時:dp[i][j]=min(dp[i+1][k-1]+dp[k][j],dp[i][j]);
因爲第k天要用第i天的內容,所以[i+1,k-1]天的衣服都要脫去;[k,j]是一個獨立的部分
#include<string>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int num=110;
int dp[num][num];
int a[num];
int main()
{
    int t;
    scanf("%d",&t);
    for(int s=1;s<=t;s++)
    {
        memset(dp,0,sizeof(dp));
        int n=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }

        for(int i=1;i<=n;i++)
            dp[i][i]=1;

        for(int i=n-1;i>=1;i--)
        {
            for(int j=i+1;j<=n;j++)
            {
                dp[i][j]=dp[i+1][j]+1;
                for(int k=i+1;k<=j;k++)
                {
                    if(a[i]==a[k])
                        dp[i][j]=min(dp[i][j],dp[i+1][k-1] + dp[k][j]);
                }
            }
        }

        printf("Case %d: %d\n",s,dp[1][n]);
    }
    return 0;
}
#include<string>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int num=110;
int dp[num][num];
int a[num];
int dfs(int L,int R)
{
    if(L>R) return 0;
    if(L==R) return dp[L][R]=1;//記得寫着一句話
    if(dp[L][R]!=-1) return dp[L][R];

    dp[L][R]=dfs(L,R-1)+1;

    for(int k=L;k<R;k++)
    {
        if(a[k]==a[R])
            dp[L][R]=min(dp[L][R],dfs(L,k)+dfs(k+1,R-1));
    }

    return dp[L][R];
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int s=1;s<=t;s++)
    {
        memset(dp,-1,sizeof(dp));
        int n=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        dfs(1,n);
        printf("Case %d: %d\n",s,dp[1][n]);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章