zoukankan      html  css  js  c++  java
  • LightOJ 1422 -Halloween Costumes 区间DP

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1422

    区间DP的思路:

    对于区间(i,j)如果第i件衣服和区间内的其他从i+1到j的衣服都不同,即第i件衣服在这个区间我们只穿一次,那么dp[i][j]=dp[i+1][j]+1;

    否则遍历k(i<k<=j),如果a[k]==a[i],那么对于第k个party,可以穿第i件衣服,此时dp[i][j]=min(dp[i][j],dp[i+1][j-1]+dp[k][j]);

    然后注意初始化即可

    自己感觉自己对区间dp的初始化还是总把握不好。。。

    代码如下:

     1 #include<iostream>
     2 #include<cstdlib>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 #define MAX 110
     8 int dp[MAX][MAX];
     9 int n;
    10 int a[MAX];
    11 int main()
    12 {
    13         int t;
    14         scanf("%d",&t);
    15         int tol=1;
    16         while(t--)
    17         {
    18                 scanf("%d",&n);
    19                 for(int i=0;i<n;i++)
    20                         scanf("%d",&a[i]);
    21                 memset(dp,0,sizeof(dp));
    22                 for(int i=0;i<n;i++)
    23                   for(int j=i;j<n;j++)
    24                        dp[i][j]=j-i+1;
    25                 for(int j=0;j<n;j++)
    26                     for(int i=j-1;i>=0;i--)
    27                     {
    28                              dp[i][j]=dp[i+1][j]+1;
    29                               for(int k=i;k<=j;k++)
    30                                  {
    31                                       if(a[i]==a[k]) dp[i][j]=min(dp[i+1][k-1]+dp[k][j],dp[i][j]);
    32                                  }
    33                     }
    34                cout<<"Case "<<tol++<<": "<<dp[0][n-1]<<endl;
    35 
    36         }
    37         return 0;
    38 }
    View Code
  • 相关阅读:
    03构建之法阅读笔记3—团队模式
    软件工程学习进度博客10
    第一阶段冲刺10
    第一阶段冲刺9
    第一阶段冲刺8
    第一阶段冲刺7
    第一阶段冲刺6
    第一阶段冲刺5
    团队项目冲刺第六天
    团队项目冲刺第五天
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/light0j1422.html
Copyright © 2011-2022 走看看