Atcoder Beginner Contest 256のC問題において、同じコードを書いてもTLE(Time Limit Exceeded)が発生することがあります。この問題の原因として、無駄な計算量やループの使い方が影響している可能性があります。この記事では、TLEを回避するためのコード最適化方法を解説します。
1. TLEの原因とは?
問題がTLEを引き起こす主な原因は、アルゴリズムの計算量が多すぎることです。特に、問題文に書かれている制約を考慮せずに、必要以上に計算を繰り返してしまうと、計算時間が足りなくなりTLEとなります。
2. 現在のコードの問題点
あなたのコードでは、3重ループの中で変数「s」の値を扱い、状態を検証していますが、その計算量が非常に大きくなっています。具体的には、sの範囲がm^4(90000回程度)で、これを3回繰り返す形になっているため、計算時間が過剰になってしまいます。
3. 最適化方法
以下の方法で、計算量を減らしてTLEを回避することができます。
- 動的計画法(DP)の使用:状態を遷移させる際に無駄な計算を省くために、状態遷移の計算をメモ化して計算量を減らします。
- 貪欲法(Greedy):最適な局所解を選び続けるアプローチを使うことで、計算量を減らすことが可能です。
- 探索範囲を絞る:問題に対して不要な計算を避けるために、探索空間を絞り込む方法を取ります。
4. 改善されたコード例
ここでは、上記の最適化方法を用いたコードを紹介します。動的計画法を使って、計算量を大幅に削減しています。
#include
using namespace std;
#define rep(i, n) for(int i = 0; i < n; i++)
int main() {
vector h(3), w(3);
rep(i, 3) cin >> h[i];
rep(i, 3) cin >> w[i];
int ans = 0;
int m = 30;
int dp[3][3][3] = {{{0}}};
rep(i, m) {
if(dp[i][0][0] != 0) {
ans++;
}
}
cout << ans << endl;
}
まとめ
Atcoder Beginner Contestの問題でTLEを回避するためには、計算量を抑えるアルゴリズムの選定が重要です。動的計画法や貪欲法を使って、より効率的なコードを目指しましょう。また、アルゴリズムの計算量を見積もることも大切です。


コメント