bamuchengren5
@bamuchengren5

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

atcoder 緑 動的計画法

解決したいこと

https://atcoder.jp/contests/abc222/tasks/abc222_d
こちらの問題を動的計画法を用いて解いたのですが、テストケースで最大値を入力した際にどうやら違う答えが出力されるようです。
自力では、どこが誤っているのかわからなかったため、教えてください。

発生している問題・エラースクリーンショット 2025-02-26 154516.png

該当するソースコード

#include<bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
using namespace std;

int main() {
  int n; cin >> n;
  vector<int> A(n),B(n);
  for(auto&a:A) cin>>a;
  for(auto&b:B) cin>>b;
  vector<vector<int>> dp(n+1,vector<int>(3001,0)); 
  rep(i,3000) dp[0][i]=1;
  rep(i,n){ //Cをi番目まで見たとき、最後の数がj以下である場合の数を求める
    for(int j=A[i]; j<3001; j++){
      if(j>B[i]) dp[i+1][j]=dp[i+1][j-1]; 
      else dp[i+1][j]=dp[i][j]+dp[i+1][j-1];
      dp[i+1][j]%=998244353;
    }
  }

  cout<<dp[n][3000]<<endl;
  return 0;
}
0

3Answer

Comments

  1. @bamuchengren5

    Questioner

    ご返信ありがとうございます。
    longlong型に変更したのですが解決できませんでした。
    変更箇所が間違っているのでしょうか。
    教えていただけるとありがたいです。

    qiita.cpp
    #include<bits/stdc++.h>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    #define rep(i, n) for (int i = 0; i < (n); i++)
    using namespace std;
    using ll = long long;
    using Graph = vector<vector<int>>;
    
    int main() {
      int n; cin >> n;
      vector<ll> A(n),B(n);
      for(auto&a:A) cin>>a;
      for(auto&b:B) cin>>b;
      vector<vector<ll>> dp(n+1,vector<ll>(3001,0)); 
      rep(i,3000) dp[0][i]=1;
      rep(i,n){ //Cをi番目まで見ているときの最後の数がj以下である場合の数を求める
        for(int j=A[i]; j<3001; j++){
          if(j>B[i]) dp[i+1][j]=dp[i+1][j-1]; 
          else dp[i+1][j]=dp[i][j]+dp[i+1][j-1];
          dp[i+1][j]%=998244353;
        }
      }
    
      cout<<dp[n][3000]<<endl;
      return 0;
    }
    

ご提示のコードですが、「A[i]が 0 だと、jも 0 となり、dp[i+1][j-1]でマイナスのインデックスを参照する」という不具合があります。

0Like

dp[3000] が 1で 初期化されてないように見えます。

- rep(i,3000) dp[0][i]=1;
+ rep(i,3001) dp[0][i]=1;
0Like

Your answer might help someone💌