• E. Sending a Sequence Over the Network(DP)


    Problem - 1741E - Codeforces

     

    序列a在网络上的发送情况如下。

    序列a被分割成若干段(序列的每个元素正好属于一个段,每个段是序列的一组连续元素)。
    对于每个段,它的长度被写在它的旁边,要么在它的左边,要么在它的右边。
    得到的序列b被发送到网络上。
    例如,我们需要发送序列a=[1,2,3,1,2,3]。假设它被分割成如下的片段。[1]+[2,3,1]+[2,3]. 那么我们可以有以下的序列。

    b=[1,1,3,2,3,1,2,3,2],
    b=[1,1,3,2,3,1,2,2,3],
    b=[1,1,2,3,1,3,2,2,3],
    b=[1,1,2,3,1,3,2,3,2].
    如果使用了不同的分割,发送的序列可能会有所不同。

    序列b是给定的。序列b可以通过网络发送吗?换句话说,是否有这样一个序列a,将a转换为网络上的发送序列b?

    输入
    输入数据的第一行包含一个整数t(1≤t≤104)--测试案例的数量。

    每个测试用例由两行组成。

    测试用例的第一行包含一个整数n(1≤n≤2⋅105)--序列b的大小。

    测试用例的第二行包含n个整数b1,b2,...,bn(1≤bi≤109)--序列b本身。

    可以保证所有测试用例的n之和不超过2⋅105。

    输出
    对于每个测试用例,在单独一行中打印。

    如果序列b可以通过网络发送,也就是说,如果序列b可以从某个序列a中得到,以便通过网络发送a,则为YES。
    否则为NO。
    你可以在任何情况下输出YES和NO(例如,字符串yEs、yes、Yes和YES将被识别为积极响应)。


    inputCopy
    7
    9
    1 1 2 3 1 3 2 2 3
    5
    12 1 2 7 5
    6
    5 7 8 9 10 3
    4
    4 8 6 2
    2
    3 1
    10
    4 6 2 1 9 4 9 3 4 2
    1
    1
    outputCopy

    是的

    没有



    备注
    在第一种情况下,序列b可以从序列a=[1,2,3,1,2,3]中得到,分区如下。[1]+[2,3,1]+[2,3]. 序列b:[1,1,2,3,1,3,2,2,3]。

    在第二种情况下,序列b可以从序列a=[12,7,5]中得到,其分割方式如下。[12]+[7,5]. 序列b:[12,1,2,7,5]。

    在第三种情况下,序列b可以从序列a=[7,8,9,10,3]中得到,分区如下。[7,8,9,10,3]. 序列b:[5,7,8,9,10,3]。

    在第四种情况下,不存在序列a,以至于改变a在网络上的传输可以产生序列b。

    题解:
    每一次判断当前位置是否合法,都要从前面转移过来

    假如说,当前位置为i,

    i-a[i]-1 >= 0边界限制

    f[i-a[i]-1]如果合法

    根据题意,那么i-a[i] ~ i一定是合法的,

    否则既然前面都已经不合法了,后面就一定不合法

    对后面元素也要判断,

    还是先判断边界

    i + a[i+1]+1<=n

    f[i]也应是合法的情况下才能进行下面的

    f[i+a[i+1]+1] = 1也一定合法

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cstring>
    4. #include<string>
    5. #include<map>
    6. #include<vector>
    7. #include<queue>
    8. using namespace std;
    9. #define int long long
    10. //1 1 3 3 3
    11. int a[300050];
    12. int f[300050];
    13. void solve()
    14. {
    15. int n;
    16. cin >> n;
    17. for(int i = 1;i <= n;i++)
    18. cin >> a[i],f[i] = 0;
    19. f[0] = 1;
    20. for(int i = 0;i <= n;i++)
    21. {
    22. if(i-a[i] -1>=0&&f[i - a[i]-1])
    23. f[i] = 1;
    24. if(f[i]&&i+a[i+1]+1<=n)
    25. f[i+a[i+1]+1] = 1;
    26. }
    27. if(f[n])
    28. cout<<"YES\n";
    29. else
    30. cout<<"NO\n";
    31. }
    32. signed main()
    33. {
    34. int t = 1;
    35. cin >> t;
    36. while(t--)
    37. {
    38. solve();
    39. }
    40. }
    41. //2 5
    42. //3
    43. //9 7
    44. //2 3 4 3

  • 相关阅读:
    机器人C++库(8)Robotics Library 之防碰撞demo rlCollisionTest
    算法(数据结构)面试问题准备 二分法/DFS/BFS/快排
    hive-学习汽车销售分析
    SCI投稿:投稿附言cover letter的写法和模板!
    【Vue+element+admin】目录详解
    python之subprocess模块详解
    【深度学习】基于卷积神经网络的验证码识别
    dojo中的类
    基于python+Django深度学习的音乐推荐方法研究系统设计与实现
    qt笔记一
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/128000628