• 【44.19%】【codeforces 608D】Zuma


    time limit per test2 seconds
    memory limit per test512 megabytes
    inputstandard input
    outputstandard output
    Genos recently installed the game Zuma on his phone. In Zuma there exists a line of n gemstones, the i-th of which has color ci. The goal of the game is to destroy all the gemstones in the line as quickly as possible.

    In one second, Genos is able to choose exactly one continuous substring of colored gemstones that is a palindrome and remove it from the line. After the substring is removed, the remaining gemstones shift to form a solid line again. What is the minimum number of seconds needed to destroy the entire line?

    Let us remind, that the string (or substring) is called palindrome, if it reads same backwards or forward. In our case this means the color of the first gemstone is equal to the color of the last one, the color of the second gemstone is equal to the color of the next to last and so on.

    Input
    The first line of input contains a single integer n (1 ≤ n ≤ 500) — the number of gemstones.

    The second line contains n space-separated integers, the i-th of which is ci (1 ≤ ci ≤ n) — the color of the i-th gemstone in a line.

    Output
    Print a single integer — the minimum number of seconds needed to destroy the entire line.

    Examples
    input
    3
    1 2 1
    output
    1
    input
    3
    1 2 3
    output
    3
    input
    7
    1 4 4 2 3 2 1
    output
    2
    Note
    In the first sample, Genos can destroy the entire line in one second.

    In the second sample, Genos can only destroy one gemstone at a time, so destroying three gemstones takes three seconds.

    In the third sample, to achieve the optimal time of two seconds, destroy palindrome 4 4 first and then destroy palindrome 1 2 3 2 1.

    【题目链接】:http://codeforces.com/contest/608/problem/D

    【题解】

    记忆化搜索;
    jyh(l,r);表示把l..r这个区间范围的数字全部去掉最少需要的操作次数;
    如果a[l]==a[r];则整个问题转化为为jyh(l+1,r-1);
    当然如果a[l]!=a[r]则还没完;
    需要枚举一下分割点i;
    把整个问题转化为l..i,和i+1..r两个部分;
    如果i==l,则说明最左边那个单独一个取出来操作一次(自己单独一个肯定是回文);
    如果l==r返回1;
    如果l==r-1->(且a[l]==a[r]返回1,如果a[l]!=a[r]返回2;)
    掌握一下那个分割序列的方法;
    其他的则没有什么了;
    最多就500*500个状态;

    【完整代码】

    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <set>
    #include <map>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <stack>
    #include <string>
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    
    using namespace std;
    
    const int MAXN = 510;
    const int INF = 0x3f3f3f3f;
    const int dx[5] = {0,1,-1,0,0};
    const int dy[5] = {0,0,0,-1,1};
    const double pi = acos(-1.0);
    
    int n,a[MAXN],f[MAXN][MAXN];
    
    void rel(LL &r)
    {
        r = 0;
        char t = getchar();
        while (!isdigit(t) && t!='-') t = getchar();
        LL sign = 1;
        if (t == '-')sign = -1;
        while (!isdigit(t)) t = getchar();
        while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
        r = r*sign;
    }
    
    void rei(int &r)
    {
        r = 0;
        char t = getchar();
        while (!isdigit(t)&&t!='-') t = getchar();
        int sign = 1;
        if (t == '-')sign = -1;
        while (!isdigit(t)) t = getchar();
        while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
        r = r*sign;
    }
    
    int jyh(int l,int r)
    {
        if (f[l][r]!=INF)
            return f[l][r];
        int *k = &f[l][r];
        if (l == r)
            return f[l][r] = 1;
        if (l==r-1)
        {
            if (a[l]==a[r])
                return f[l][r]=1;
            else
                return f[l][r] = 2;
        }
        if (a[l] == a[r])
            *k = jyh(l+1,r-1);
        for (int i = l;i <= r;i++)
            *k = min(*k,jyh(l,i)+jyh(i+1,r));
        return f[l][r];
    }
    
    int main()
    {
       // freopen("F:\rush.txt","r",stdin);
        memset(f,INF,sizeof(f));
        rei(n);
        for (int i = 1;i <= n;i++)
            rei(a[i]);
        printf("%d
    ",jyh(1,n));
        return 0;
    }
  • 相关阅读:
    Grunt学习笔记【7】---- grunt-contrib-less插件详解
    Grunt学习笔记【6】---- grunt-contrib-requirejs插件详解
    Grunt学习笔记【5】---- expand使用方法
    Grunt学习笔记【4】---- 通配符和模板
    Grunt学习笔记【3】---- filter使用方式和实现原理详解
    Grunt 学习笔记【2】---- 配置和创建任务
    用css去除chrome、safari等webikt内核浏览器对控件默认样式
    angular中通过$location获取路径(参数)的写法
    angular自身带有的操作cookie的方法
    js中apply方法的使用
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632078.html
Copyright © 2020-2023  润新知