SDUT 2893 B(DP 記憶化搜尋)

2021-09-06 21:22:44 字數 1777 閱讀 6704

time limit: 1000ms   memory limit: 65536k  有疑問?點這裡^_^

有n塊地板排成一條直線,從左到右編號為1,2,3. . . n-1,n,每塊地板上有乙個權值w。如今要小b用這n塊地板玩乙個遊戲。

小b能夠選擇隨意一塊地板作為起點,然後向右跳k次,每次最多能夠跳5個格仔(設起跳點地板編號為x,落地點為y,y-x <= 5)。每踩在一塊地板上,小b的得分sum += wi

,小b每次僅僅能踩一塊地板,開始時sum = 0。如今請你編寫乙個程式求最大的sum。

多組輸入.第一行輸入兩個整數n,k。(1<= n && n <= 100 ,1 <= k && k <= min(n,50))。

接下來n行,每行乙個整數,依次表示wi。(0  <= wi && wi <= 100)。

每組資料輸出乙個整數,代表答案。

10 1

0 0 0 10 1 2 3 4 5 6

15
卡了兩天了。。倒是一看就是dp可解,大體狀態也表示好了,但死活沒推出狀態轉移方程。看了一下標程,頓感自己薩比了。。
dp[i][j] 代表跳j次能夠到達i處(i為陣列下標) 可得
dp[i][j]=max(dp[i][j],dp[i-k][j-1])(k∈[1,min(i,5)]);注意邊界。。
#include #include #include #include #include #include #include #include #include #include #define ll long long

using namespace std;

const int inf=0x3f3f3f3f;

int n,k,a[110],dp[110][55];

int main()

for(int i=1;i<=n;i++)

}int ans=-inf;

for(int i=1;i<=n;i++)

ans=max(ans,dp[i][k]);

printf("%d\n",ans);

} return 0;

}

看了標程寫的記憶化搜尋,感覺記憶化也沒那麼神奇了,曾經從來沒了解過qaq。。我的理解是:找出狀態陣列,當你推不出來狀態轉移方程的時候,記憶化搜尋也許不失為一種解決方式。前提是要有把搜尋過程中的資料儲存起來的思想,盲目的暴搜是不能解決這個問題的。。會t到沒盆友的我深有體會。。
#include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

const int maxn=110;

const int inf=0x3f3f3f3f;

int a[maxn],n,kk,tem,ans;

int dp[maxn][55];

int dfs(int s,int k)

dp[s][k]+=tem;

return dp[s][k];

}int main()

printf("%d\n",ans);

} return 0;

}

skiing 記憶化深搜

這道題就是找出一條最長連續遞減序列,並求出其長度。可以用記憶化深搜,求出每一點最長序列的長度,然後求最大值即可。如下 include includeusing namespace std const int n 105 int a n n m,n,f n n inline int max int a...

poj1661Help Jimmy 記憶化搜尋

這是找的倒數第二簡單的,然而依舊不會,淚 昨天晚上調出來發現是 以示例為例 從倒數第二個平台直接跳下去 時間是0 從上面第乙個跳下去 時間依舊是0 orz 12點半躺床上頓悟應該每個平台的時間不僅是乙個,有左右兩個時間 唯一值得欣慰是發現了 dp值裡面不用加上高度下落的時間差,最後dp 下落的高度,...

HDU1501 Zipper(DFS 記憶化搜尋)

題意 給三個字串,保證第三個串長度是前兩個串長度之和,確定前兩個串保持原有的字母順序能不能拼成第三個串。思路 直接搜尋的話會有大量重複的運算,要用記憶化陣列記錄之前的結果。當匹配到第乙個串的第i位和第二個串的第j位時,前面可能有多種情況,但三個串後面的長度一定,所以結果也可以確定,用vis i j ...