松散子序列

 题目描述

松散子序列_第1张图片

 代码实现

#include 
#define int long long
using namespace std;

const int N = 1000010;
int a[N];

signed main()
{
    /**
        寻找前i个字母中价值最大的组合
    **/
    string str;
    cin>>str;
    // 要找到当前位置的最大价值,分为两种情况:不选,就是前一个值;选,要不选前一个值跳一个来选
    a[0] = str[0] - 'a' + 1ll;
    a[1] = max(a[0],str[1]-'a'+1ll);
    int n = str.size();
    for(int i = 2;i < n;i++) {
        a[i] = max(a[i-1],a[i-2]+str[i]-'a'+1);
    }
    cout<

题目思考

        也有些天没有更新这个每日一题系列了,是因为听了听大佬的建议,写题解就是浪费时间 ;虽然这样说,可能是层次不一样,我也不太能理解;但是大佬能将这些算法的原理应用到生活中,这就很NB,要想达到这个层次,是需要不少时间的积累的,听他讲算法,就好像他已将将算法融入到自己的思维中了,并且还能运筹帷幄!

        说下我以后学算法的思路,首先要做到理解,理解它的原理,用法;因为我从来都是不喜欢背东西;那么每做一题,都是对一个算法的应用,可以不写题解,但是我想可以以这个算法的角度出发,他该怎么适应这个题目,这可能使我们要思考并记录的,可能做的题目多了,每一个算法的应用场景就可以固定在某几种形式中。

        说下这个题,应为对于每一个字母位置都涉及到一个状态转移的动作,那么可以想到动态规划,当题目中涉及到二维的状态转移的时候,就要运用递归的思想了;当然再这个题中,只用到了一维的改变那就是前 i 个字母的最大价值。

你可能感兴趣的:(蓝桥杯,c++,算法,数据结构,蓝桥杯)