蓝桥杯更小的数(区间DP)

题目描述

小蓝有一个长度均为 n 且仅由数字字符 0 ∼ 9 组成的字符串,下标从 0 到 n − 1,你可以将其视作是一个具有 n 位的十进制数字 num,小蓝可以从 num 中选出一段连续的子串并将子串进行反转,最多反转一次。小蓝想要将选出的子串进行反转后再放入原位置处得到的新的数字 numnew 满足条件 numnew < num,请你帮他计算下一共有多少种不同的子串选择方案,只要两个子串在 num 中的位置不完全相同我们就视作是不同的方案。注意,我们允许前导零的存在,即数字的最高位可以是 0 ,这是合法的

输入格式 :输入一行包含一个长度为 n 的字符串表示 num(仅包含数字字符 0 ∼ 9),从左至右下标依次为 0 ∼ n − 1。

输出格式:输出一行包含一个整数表示答案。

复制代码
输入:210102
输出:8

提示

一共有 8 种不同的方案:

1)所选择的子串下标为 0 ∼ 1 ,反转后的 numnew = 120102 < 210102 ;

2)所选择的子串下标为 0 ∼ 2 ,反转后的 numnew = 012102 < 210102 ;

3)所选择的子串下标为 0 ∼ 3 ,反转后的 numnew = 101202 < 210102 ;

4)所选择的子串下标为 0 ∼ 4 ,反转后的 numnew = 010122 < 210102 ;

5)所选择的子串下标为 0 ∼ 5 ,反转后的 numnew = 201012 < 210102 ;

6)所选择的子串下标为 1 ∼ 2 ,反转后的 numnew = 201102 < 210102 ;

7)所选择的子串下标为 1 ∼ 4 ,反转后的 numnew = 201012 < 210102 ;

8)所选择的子串下标为 3 ∼ 4 ,反转后的 numnew = 210012 < 210102 ;

对于 20% 的评测用例,1 ≤ n ≤ 100 ;对于 40% 的评测用例,1 ≤ n ≤ 1000 ;对于所有评测用例,1 ≤ n ≤ 5000 。

思路:

首先,子串的左右端点以及它的长度不确定,而右端点=左端点+长度,因此可以写两层for循环得到子串的大小和位置。接着,如果是暴力 做法,意味着每次要翻转字串o(n)再比较o(n**3),如果是DP ,则要找状态转移方程o(1),一共是o(n**2)。这里DP要分情况讨论,**f[l][r]**表示左端点为l右端点为r的区间经过反转之后是否能符合题意,如果可以则为1,不可以则为0,最后要求的答案就是f[l][r]的加和。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	string s;
	cin>>s;
	int ans=0;
	int N=s.size();
	int f[N][N]; 
	for(int i=2;i<s.size();i++)
	{
		for(int l=0;l<s.size()-i-1;l++)
		{
		    int r=l+i;
		    if(s[l]>s[r]) f[l][r]=1;
		    if(s[l]==s[r]) f[l][r]=f[l+1][r-1];
		    else f[l][r]=0;
		    ans+=f[l][r];
	    }
	}
	cout<<ans<<endl;
 } 
相关推荐
阑梦清川10 分钟前
算法竞赛---宽度优先遍历求解最短路径问题(方向数组里面是4个元素)
算法
Ghost-Face23 分钟前
《算法导论》笔记——循环不变式及插入排序证明
算法
想你依然心痛41 分钟前
编程算法:技术创新与业务增长的核心驱动力
算法
焊锡与代码齐飞1 小时前
嵌入式第十八课!!数据结构篇入门及单向链表
c语言·数据结构·学习·算法·链表·排序算法
AI松子6661 小时前
Sparse4D系列算法:迈向长时序稀疏化3D目标检测的新实践
人工智能·算法·目标检测
仪器科学与传感技术博士1 小时前
python:如何调节机器学习算法的鲁棒性,以支持向量机SVM为例,让伙伴们看的更明白
python·算法·机器学习
幻风_huanfeng1 小时前
自然语言理解领域算法模型演进图谱
算法
yuyousheng2 小时前
C语言使用GmSSL库实现sm3、sm4算法
c语言·算法·哈希算法
菜就多练,以前是以前,现在是现在2 小时前
Codeforces Round 986 (Div. 2)
c++·算法
瓦特what?3 小时前
C + +
c语言·开发语言·c++·经验分享·笔记·算法·程序员创富