1. 程式人生 > >[Usaco2006 Oct]Another Cow Number Game 奶牛的數字遊戲 記憶化搜尋

[Usaco2006 Oct]Another Cow Number Game 奶牛的數字遊戲 記憶化搜尋

奶牛們又在玩一種無聊的數字遊戲。輸得很鬱悶的貝茜想請你寫個程式來幫她在開局時預測結果。在遊戲的開始,每頭牛都會得到一個數N(1<=N<=1,000,000)。此時奶牛們的分數均為0。如果N是奇數,那麼奶牛就會把它乘以3後再加1。如果N是偶數,那麼這個數就會被除以2。數字每變動一次,這頭奶牛就得到1分。當N的值等於1時,遊戲結束,此時的分數就是這頭奶牛在這局遊戲中的最終得分。 以下是N的初始值為5時,一局遊戲的完整過程: N 操作後所得數 註釋 總分 5 16 3*5+1 1 16 8 16/2 2 8 4 8/2 3 4 2 4/2 4 2 1 2/2 5 這頭奶牛的最終得分是5。

這其實就是3*n+1問題

直接模擬的話就能過,需要注意中間過程會爆int

不過可以稍微加點記憶化

注意到1000W一下的數會被訪問很多次,所以記錄1000W以下的。

#include <iostream>
using namespace std;
int a[11111111];
int gao(long long x)
{
    if(x == 1) return 1;
    if(x < 10000000 && a[x]) return a[x];
    int tmp;
    if(x % 2 == 0)
        tmp = gao(x / 2) + 1;
    else
        tmp = gao(x * 3 + 1) + 1;
    if(x < 10000000) a[x] = tmp;
    return tmp;
}
int main()
{
    int n;
    cin >> n;
    cout << gao(n)  - 1<< endl;
    return 0;
}