洛谷OJ-P1464 Function

題目描述

題目描述

解析:這題屬于遞歸問(wèn)題,如果直接遞歸求值會(huì)導(dǎo)致超時(shí)問(wèn)題,需要用記憶化搜索的方法,用空間換取時(shí)間。


記憶化搜索在求解的時(shí)候還是按著自頂向下的順序,但是每求解一個(gè)狀態(tài),就將它的解保存下來(lái),(用數(shù)組存儲(chǔ))

以后再次遇到這個(gè)狀態(tài)的時(shí)候,就不必重新求解了。

這種方法綜合了搜索和動(dòng)態(tài)規(guī)劃兩方面的優(yōu)點(diǎn),因而還是很有實(shí)用價(jià)值的。

本題通過(guò)數(shù)組long long w_mem[25][25][25];存儲(chǔ)解數(shù)據(jù)。

若遇到為求過(guò)的w則先賦值給w然后再返回,若求過(guò)則直接返回。

結(jié)合宏定義(記憶宏)的方法
我們加入這樣一個(gè)語(yǔ)句

#define W_MEM(x,y,z) (w_mem[x][y][z] ? w_mem[x][y][z] : w_mem[x][y][z] = w(x,y,z))

就可以簡(jiǎn)化代碼了。

#include <bits/stdc++.h>
using namespace std;

#define W_MEM(x,y,z) (w_mem[x][y][z] ? w_mem[x][y][z] : w_mem[x][y][z] = w(x,y,z))

long long w_mem[25][25][25];

long long w(long long a,long long b,long long c)
{
    if(a <= 0 || b <= 0 || c <= 0)
    {
        return 1;
    }
    if(a > 20 || b > 20 || c > 20)
    {
        return W_MEM(20,20,20);
    }
    if(a < b && b < c)
    {
        return W_MEM(a,b,c-1) + W_MEM(a,b-1,c-1) - W_MEM(a,b-1,c);
    }
    return W_MEM(a-1,b,c) + W_MEM(a-1,b-1,c) + W_MEM(a-1,b,c-1) - W_MEM(a-1,b-1,c-1);
}

int main()
{
    string input;
    while(getline(cin,input))
    {
        stringstream ss(input);
        long long a,b,c;
        ss>>a>>b>>c;
        if(a==-1&&b==-1&&c==-1)
        {
            break;
        }
        cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<w(a,b,c)<<endl;
    }
    return 0;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容