LOJ 1422(区间DP)

来源:互联网 发布:2016coc双王升级数据 编辑:程序博客网 时间:2024/05/18 13:10


转移方程 dp[i][j] = min(dp[i+1][j] + 1 , dp[i+1][k-1] + dp[k][j]);

dp数组代表i到j最少需要多少件衣服。

k 代表在i+1到j内符合 s[i] = s[k] 的k值;

如果k值不存在那么 等于上一个区间加上一件新衣服。


#include <bits/stdc++.h>#define INF 0x3f3f3fusing namespace std;const int maxn = 500;int T;int n;int s[maxn];int dp[maxn][maxn];int main(){    cin >> T;    int kase = 1;    while(T--)    {        memset(dp,0,sizeof(dp));        memset(s,0,sizeof(s));        cin >> n;        for(int i = 1 ; i <= n; i++)        {            cin >> s[i];        }        for(int i = 1 ; i <= n ; i++)        {            dp[i][i] = 1;        }        for(int l = 1 ; l <= n ; l++)        {            for(int i = 1; i + l  <= n ;i++)            {                int j = i + l;                bool flag = false;                dp[i][j] = dp[i+1][j] + 1;                for(int k = i + 1 ; k <= j ;k++)                {                    if(s[k] == s[i])                    {                        dp[i][j] = min(dp[i][j] , dp[i+1][k-1] + dp[k][j]);                        flag = true;                    }                }            }        }        printf("Case %d: %d\n",kase++,dp[1][n]);    }    return 0;}


原创粉丝点击