Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 배열 복원


배열 A의 배열 요소를 인쇄하는 데 사용되는 프로그램이 있지만 프로그램에 약간의 실수가 있다고 가정합니다. 그 프로그램에서 각 요소 뒤에 공백이 없었습니다. 그래서 우리가 하나의 인쇄된 문자열을 가지고 있다면, 배열을 다시 생성할 수 있습니까? 배열 요소가 1에서 k 범위에 있다는 것을 알고 있습니다.

문자열 s와 정수 k가 주어집니다. 어레이를 복원할 수 있는 방법의 수를 찾아야 합니다. 답은 매우 클 수 있으므로 모듈로 10^9 + 7을 반환합니다.

따라서 입력이 S ="1318" 및 k =2000과 같으면 출력은 8이 됩니다. [1318], [131,8], [13,18],[1,318과 같은 8개의 다른 배열을 형성할 수 있기 때문입니다. ],[1,3,18],[1,31,8],[13,1,8],[1,3,1,8]

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 상수 정수 m =1e9 + 7

  • 하나의 맵 dp 정의

  • add() 함수를 정의하면, b,

  • return ((a mod m) + (b mod m)) mod m

  • help() 함수를 정의하면 idx, s, num, k,

    가 필요합니다.
  • idx>=크기가 s이면 -

    • 1 반환

  • idx가 dp에 있고 num이 dp[idx]에 있으면 -

    • 반환 dp[idx, num]

  • ret :=0

  • num>=1이고 num>=k이고 s[idx]가 '0'과 같지 않으면 -

    • ret :=add(help(idx, s, 0, k), ret)

  • num * 10 + (s[idx] - '0') <=k이면 -

    • ret :=add(help(idx + 1, s, num * 10 + (s[idx] - '0'의 ASCII), k), ret)

  • dp[idx, num] :=ret

  • 리턴 렛

  • 주요 방법에서 다음을 수행하십시오 -

  • n :=s

    의 크기
  • 크기가 n + 1인 배열을 정의하십시오.

  • 답변[0] :=1

  • s :=s 앞에 공백 하나 연결

  • ks :=k를 문자열로 변환

  • initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −

    • cnt :=1

    • temp :=빈 문자열

    • j>=1 및 cnt <=10일 때 j>=1 및 cnt <=10일 때 초기화 j :=i에 대해 업데이트(j를 1만큼 감소), (cnt를 1만큼 증가) 다음을 수행합니다. -

      • 온도 :=s[j] + 온도

      • s[j]가 '0'과 같으면 -

        • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

      • temp 크기> ks 크기이면 -

        • 루프에서 나오세요

      • val :=숫자로 나타낸 온도

      • val>=1이고 val <=k이면 -

        • ans[i] :=add(ans[i], ans[j - 1])

  • 반환 [n]

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const int m = 1e9 + 7;
class Solution {
   public:
   unordered_map<int, unordered_map<lli, int> > dp;
   lli add(lli a, lli b){
      return ((a % m) + (b % m)) % m;
   }
   int help(int idx, string& s, lli num, int k){
      if (idx >= s.size())
      return 1;
      if (dp.count(idx) && dp[idx].count(num))
      return dp[idx][num];
      int ret = 0;
      if (num >= 1 && num <= k && s[idx] != '0') {
         ret = add(help(idx, s, 0, k), ret);
      }
      if (num * 10 + (s[idx] - '0') <= k) {
         ret = add(help(idx + 1, s, num * 10 + (s[idx] - '0'), k),
         ret);
      }
      return dp[idx][num] = ret;
   }
   int numberOfArrays(string s, int k){
      int n = s.size();
      vector<lli> ans(n + 1);
      ans[0] = 1;
      s = " " + s;
      string ks = to_string(k);
      for (lli i = 1; i <= n; i++) {
         lli cnt = 1;
         string temp = "";
         for (lli j = i; j >= 1 && cnt <= 10; j--, cnt++) {
            temp = s[j] + temp;
            if (s[j] == '0')
               continue;
            if (temp.size() > ks.size())
            break;
            lli val = stol(temp);
            if (val >= 1 && val <= k) {
               ans[i] = add(ans[i], ans[j - 1]);
            }
         }
      }
      return ans[n];
   }
};
main(){
   Solution ob;
   cout << (ob.numberOfArrays("1318",2000));
}

입력

"1318", 2000

출력

8