首页 > 试题广场 >

遗忘的记忆

[编程题]遗忘的记忆
  • 热度指数:206 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小苯是“小红书app”的一位博主,他在自己的账号中发布了 n 篇分享,编号从 1n
有一天他想试试看自己能不能准确的记住这 n 篇分享的点赞数,但他很快就发现凭自己的记忆力根本没法准确地记住每一篇的点赞数。但他记得如下两种信息:

\bullet 每篇分享的点赞量都为正数,且不超过 m 。
\bulleti 篇分享的点赞量和第 i-1 篇分享的点赞量的大小关系。

他想知道,在已知这些信息的前提下,所有分享的点赞量有多少种不同的可能。
(结果可能很大,请输出其对 1000000007 取模的值)

输入描述:
输入包含两行。
第一行两个正整数 n, m\ (1 \leq n, m \leq 2000),分别表示分享的总个数和每篇分享的点赞数的上限。
第二行一个长度为 n-1 的字符串 s,其中只包含 ">","<","=" 这三种字符。如果 s_i =  '>' ,则第 i 篇分享的点赞量严格高于第 i+1 篇,"<" 和 "=" 同理。


输出描述:
输入一行一个整数表示符合条件的分享点赞量个数,结果对 1000000007 取模。
示例1

输入

4 3
<=>

输出

5

说明

[1, 2, 2, 1]
[2, 3, 3, 2]
[1, 3, 3, 1]
[2, 3, 3, 1]
[1, 3, 3, 2]
一共五种可能
//二维dp+前缀和
#include<climits>
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<unordered_map>
#include<stack>
#include<sstream>
#include<regex>
using namespace std;


struct ListNode {
    int val;
    struct ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};


int n, m;
int MOD = 1e9 + 7;
string s;
long long int ans=0;
int main() {
    cin >> n >> m;
    cin >> s;
    vector<vector<int>>dp(n + 1, vector<int>(m+1,0));
    vector<int>sum(m + 1, 0);
    for (int j = 1;j <= m;j++)
    {
        dp[1][j] = 1;
        sum[j] = sum[j - 1] + dp[1][j];
    }
    for (int i = 2;i <= n;i++)
    {
        for (int j = 1;j <= m;j++)
        {          
            if (s[i - 2] == '=')
            {
                dp[i][j] = dp[i - 1][j ];
            }
            else if (s[i - 2] == '<')
            {              
                dp[i][j] = (dp[i][j] % MOD + (sum[j-1]) % MOD) % MOD;
            }
            else
            {              
                dp[i][j] = (dp[i][j]%MOD + (sum[m]-sum[j]) % MOD) % MOD;               
            }      
        }    
        for (int j = 1;j <= m;j++)
        {
            sum[j] = (sum[j-1]%MOD+dp[i][j]%MOD)%MOD;           
        }      
    }
    for (int j = 1;j <= m;j++)
    {
        ans = (ans%MOD + dp[n][j]%MOD)%MOD;
    }
    cout << ans;
    return 0;
}
发表于 2025-06-02 22:26:05 回复(0)