• 蓝桥杯22年第十三届省赛-数组切分|线性DP


    题目链接:

    蓝桥杯2022年第十三届省赛真题-数组切分 - C语言网 (dotcpp.com)

     1.数组切分 - 蓝桥云课 (lanqiao.cn)

    这道题C语言网数据会强一些。 

     说明:

    对于一个切分的子数组,由于数组是1-N的一个排列,所以每个数唯一 可以用子数组最大值-最小值==子数组长度-1(子数组右端点索引 -左端点索引+1-1)来判断 。
      
     尝试题目求什么,我们就设dp数组为 什么,那么设f[i]为 前i个数能有f[i]种方案, 
     观察样例,手工计算, A=1,3,2,4 
     i为1时,方案为 : 
     {1} 
     i为2时,方案为: 
      {1}{3}    而{1,3}不行   
     i为3时,方案为 :
     {1}{3}{2},{1}{3,2},{1,3,2} 而{1,3}{2}不行   
     i为4时,方案为:
      {1}{3}{2}{4},{1}{3,2}{4},{1,3,2}{4} ,{1}{3,2,4},{1,3,2,4} 
      而{1}{3}{2,4},{1,3}{2}{4}不行 
      
      发现当加入第i个数是时,如果把第j个数和第i个数划成一组,如果这个划分合法,
      那么他就能和f[j-1] 的每个方案 组合成 合法方案,于是累加上[j,i]划分合法时每个
      f[j-1]就是f[i]的值 。


     注意:如果1到i所有数在一个切分里能组成合法的区间,这时的j-1为0 ,故初始化f[0]=1

    在c语言网用scanf输入,才能ac,用cin有一个测试点过不了。

    代码:

    1. #include
    2. //#define int long long
    3. using namespace std;
    4. const int N=1e5+10;
    5. /*
    6. 对于一个切分的子数组,由于数组是1-N的一个排列,所以每个数唯一
    7. 可以用子数组最大值-最小值==子数组长度-1(子数组右端点索引
    8. -左端点索引+1-1)来判断
    9. 尝试题目求什么,我们就设dp数组为 什么,那么设f[i]为 前i个数能有
    10. f[i]种方案,
    11. 观察样例,手工计算, A=1,3,2,4
    12. i为1时,方案为 :
    13. {1}
    14. i为2时,方案为:
    15. {1}{3} 而{1,3}不行
    16. i为3时,方案为 :
    17. {1}{3}{2},{1}{3,2},{1,3,2} 而{1,3}{2}不行
    18. i为4时,方案为:
    19. {1}{3}{2}{4},{1}{3,2}{4},{1,3,2}{4} ,{1}{3,2,4},{1,3,2,4}
    20. 而{1}{3}{2,4},{1,3}{2}{4}不行
    21. 发现当加入第i个数是时,如果把第j个数和第i个数划成一组,如果这个划分合法,
    22. 那么他就能和f[j-1] 的每个方案 组合成 合法方案,于是累加上[j,i]划分合法时每个
    23. f[j-1]就是f[i]的值 。
    24. 注意:如果1到i所有数在一个切分里能组成合法的区间,这时的j-1为0 ,故初始化f[0]=1
    25. */
    26. int a[N];
    27. //表示前i个数能有f[i]种切分方法
    28. int f[N];
    29. int mod=1000000007;
    30. int n;
    31. int main()
    32. {
    33. ios::sync_with_stdio(0);
    34. cin.tie(0);cout.tie(0);
    35. cin>>n;
    36. for(int i=1;i<=n;i++){
    37. // cin>>a[i];
    38. //开long long 之后 用scanf格式控制符要用lld
    39. //用scanf要关掉上面的ios语句
    40. scanf("%d",&a[i]);
    41. }
    42. //需要初始化0处为1,因为如果1到i所有数在一个切分里能组成合法的区间
    43. //这时的j-1为0 ,故f[0]=1
    44. f[0]=1;
    45. f[1]=1;
    46. for(int i=2;i<=n;i++){
    47. //序列最小值减最大值等于序列长度-1,即为自然数
    48. int ma=a[i],mi=a[i];
    49. for(int j=i;j>=1;j--){
    50. //维护最值
    51. ma=max(ma,a[j]),mi=min(mi,a[j]);
    52. if(ma-mi==i-j){
    53. f[i]=(f[i]+f[j-1])%mod;
    54. }
    55. }
    56. }
    57. cout<
    58. return 0;
    59. }

  • 相关阅读:
    18.C++中模板参数类型推断与引用
    MySQL---索引+事务
    17条好用的 Python 技巧分享
    CSS 布局案例: 2行、多行每行格数不定,最后一列对齐
    Python 接口测试框架
    VS中cmake多配置构建设置
    网络安全(黑客技术)—2024自学
    springboot+vue+elementUI大学生体质测试管理系统#毕业设计
    输入神经网络的数据类型要求,神经网络数据格式
    mysql8.0英文OCP考试第31-40题
  • 原文地址:https://blog.csdn.net/qq_61814350/article/details/137424534