使用Bottom to up DP方法,我能够解决问题如何解决http://www.spoj.com/problems/MST1/达到10 ^ 8。
如果输入非常大,则高达10^9
。我将无法为10^9
创建查找表。那么解决问题的更好方法是什么?
是否有任何启发式解决方案?
答案 0 :(得分:0)
#include <iostream>
#include <climits>
#include <algorithm>
using namespace std;
int main()
{
const int N_MAX = 20000001;
int *DP = new int[N_MAX];
DP[1] = 0;
for (int i = 2; i < N_MAX; i++) {
int minimum = DP[i - 1];
if (i % 3 == 0) minimum = min(minimum, DP[i/3]);
if (i % 2 == 0) minimum = min(minimum, DP[i/2]);
DP[i] = minimum + 1;
}
int T, N; cin >> T;
int c = 1;
while (T--) {
cin >> N;
cout << "Case " << c++ << ": " << DP[N] << endl;
}
delete[] DP;
}