#32213: 不用dp 一般迴圈就會過


xig1517 (超級小蛇)

學校 : 元智大學
編號 : 142909
來源 : [140.138.224.30]
最後登入時間 :
2023-12-27 20:25:18
c039. 00100 - The 3n + 1 problem -- UVa100 | From: [140.138.241.178] | 發表日期 : 2022-09-21 23:36

我是寫遞迴+dp
因為是連續輸入 所以我就把在前幾輪跑過的數字放進map裡
下一個輸入需要用的時候拿出來用
(算是dp嗎xd)

不過網路上看到有人直接用while迴圈
我試著丟上去也AC了

對比一下執行時間 我的方法大概快了1ms
但記憶體多了快1mb

需要dp嗎?我覺得不用

----

順帶一提 我把cin cout改成scanf printf直接TLE (1s)
不知道是不是我寫錯 因為要從14ms變到1s是真的蠻邪門的

 
#32214: Re: 不用dp 一般迴圈就會過


xig1517 (超級小蛇)

學校 : 元智大學
編號 : 142909
來源 : [140.138.224.30]
最後登入時間 :
2023-12-27 20:25:18
c039. 00100 - The 3n + 1 problem -- UVa100 | From: [140.138.241.178] | 發表日期 : 2022-09-21 23:38

我是寫遞迴+dp
因為是連續輸入 所以我就把在前幾輪跑過的數字放進map裡
下一個輸入需要用的時候拿出來用
(算是dp嗎xd)

不過網路上看到有人直接用while迴圈
我試著丟上去也AC了

對比一下執行時間 我的方法大概快了1ms
但記憶體多了快1mb

需要dp嗎?我覺得不用

----

順帶一提 我把cin cout改成scanf printf直接TLE (1s)
不知道是不是我寫錯 因為從14ms變到1s是真的蠻邪門的

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define space ' '

map<int,int> dp;

int loop (int num)
{
    if (num == 1 || dp[num] != 0) return dp[num];

    dp[num] = ((num%2) ? loop(num*3+1):loop(num/2))+1;

    return dp[num];
}

main ()
{
    int i, j;
    while(cin>>i>>j){
        int maxNumber = -1;
        for (int cnt = min(i, j); cnt<=max(i, j); cnt++) {
            maxNumber = max(loop(cnt)+1, maxNumber);
        }
        cout<<i<<space<<j<<space<<maxNumber<<endl;
    }
}



 
#32215: Re: 不用dp 一般迴圈就會過


xig1517 (超級小蛇)

學校 : 元智大學
編號 : 142909
來源 : [140.138.224.30]
最後登入時間 :
2023-12-27 20:25:18
c039. 00100 - The 3n + 1 problem -- UVa100 | From: [140.138.241.178] | 發表日期 : 2022-09-21 23:41

我是寫遞迴+dp
因為是連續輸入 所以我就把在前幾輪跑過的數字放進map裡
下一個輸入需要用的時候拿出來用
(算是dp嗎xd)

不過網路上看到有人直接用while迴圈
我試著丟上去也AC了

對比一下執行時間 我的方法大概快了1ms
但記憶體多了快1mb

需要dp嗎?我覺得不用

----

順帶一提 我把cin cout改成scanf printf直接TLE (1s)
不知道是不是我寫錯 因為從14ms變到1s是真的蠻邪門的

#include
using namespace std;
#define endl '\n'
#define space ' '

map dp;

int loop (int num)
{
    if (num == 1 || dp[num] != 0) return dp[num];

    dp[num] = ((num%2) ? loop(num*3+1):loop(num/2))+1;

    return dp[num];
}

main ()
{
    int i, j;
    while(cin>>i>>j){
        int maxNumber = -1;
        for (int cnt = min(i, j); cnt<=max(i, j); cnt++) {
            maxNumber = max(loop(cnt)+1, maxNumber);
        }
        cout<    }
}



拍寫 上面打錯
我的方法是18ms 比人家用迴圈慢了3ms
直接用迴圈就好

 
ZeroJudge Forum