区间dp

原创 2017年07月25日 20:39:23

区间dp

题目链接:https://vjudge.net/contest/169127#problem/F

这是我做的第一个区间dp,个人觉得,区间dp就是根据区间的变化来反映整个区间的变化,通过一个个小区间的动归的递推,很容易得出最后的整个区间。

题意:告诉有n场晚会中需要穿的衣服,衣服是可以套在其他衣服外面的,告诉了序列顺序之后求出最少需要穿多少次衣服。

解题思路:使用dp[i][j]来表示区间 i~j的答案,那么对于第 i 件衣服,我们有
①:如果在之后的区间内都不再重复利用这件衣服,那么明显 dp[i][j] = dp[i+1][j] + 1
②:如果在之后的区间 i+1 ~ j 中存在一件衣服 k 是跟 i 一样的,那么我们便可以考虑是不是可以将i那件衣服在k这个地方重复利用,那么转移方程为 dp[i][j] = min(dp[i][j] , dp[i][k-1]+dp[k+1][j])
因为是从后面的区间往前面转,所以循环的时候应该是从后往前的

各位大佬有什么好的见解可以给我留评论,小弟在此谢过。。。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;
typedef long long ll;
//const ll inf=1e15;
const ll inf=0x3f3f3f3f3f3f3f;
int a[100+10];
int dp[110][110];
int main()
{
    int t;
    cin>>t;
    int kase=0;
    while(t--)
    {
        int n;
        cin>>n;//n件衣服
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++)
            dp[i][j]=j-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][k-1]+dp[k+1][j]);//注意这个的第k天的衣服被省略掉了,因为第k天的衣服和第i天一样
                }
            }
        }
        cout<<"Case "<<++kase<<": ";
        cout<<dp[1][n]<<endl;
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

SPOJ-ZUMA(区间DP)

题意就与祖玛游戏差不多,唯一的区别在于当个数大于等于K的时候你可以选择不消掉,可以与之后的同色一起消。 一开始想了一个错误的状态转移,后来找到反例就不说了。首先可以预处理一下,把颜色相同的给放在一起...

区间dp模型(石子归并,括号匹配,整数划分)

1) 石子归并问题 题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 描述: 有N堆石子排成...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

ZOJ 3541-The Last Puzzle(区间DP)

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4496 The Last Puzzle Time ...

poj1651(区间dp)

Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7255   Acce...
  • d_x_d
  • d_x_d
  • 2015-09-03 12:43
  • 272

poj 1141Brackets Sequence[区间dp]

原题链接poj 1141 Brackets Sequence 由于对括号匹配的时候不只有一种方案,而本题要求要找最少的那种匹配方案,故可以用区间dp; dp[i][j]表示从i到j之间为了匹配所需...

HDU 4293 Groups(区间DP)

/* 具体思路参见:http://hi.baidu.com/dispossessed/item/320544233e27109b9c63d1a6 将每组数据转换为区间以后,然后按照x从小到大排序,便可...

[ACM] n个数分为m部分,要求每部分的和乘起来积最大(区间DP)

A - 爱管闲事 春希非常爱管闲事,他每天都会抽空帮助一些同学,由于春希非常死板,出于公平性,春希不会先帮助后来找他的同学。 现在有n个同学需要他的帮助,虽然他很想一天之类帮助所有人,...

hdu 4597 Play Game 记忆化搜索 区间dp

题意: 给你两摞牌,每次可以任意一堆 的牌头或者牌尾抽牌。Alice先抽,Bob后抽,两个人都想抽到最多点数的牌。 做法: dp[az][ay][bz][by]。 az,ay代表第一堆牌左边 和右...

CodeForces 149D Coloring Brackets(区间DP)

题目链接:Coloring Brackets #define mem(a,x) memset(a,x,sizeof(a)) #include #include #include #include #i...

nyoj737 石子合并 区间dp

描述     有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)