又是一道套路水题,思路就是用dp数组记录状态,把当前状态的值相当于设置为X,然后依次返回最终求得初始值X,其中已经经历过的状态已经记录就不会像直接递归那样耗费太多时间,这就是dp的思想。
题目链接:https://vjudge.net/problem/HDU-1176
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int f[3] = {-1,0,1};
int G[11][100005];
int dp[11][100005];
int n;
int dfs (int pos , int t) {
if (dp[pos][t]) return dp[pos][t];
if (t > n) return 0;
int ans = 0;
for (int i = 0 ; i < 3 ; i++)
if (pos+f[i] >= 0 && pos+f[i] <= 10) ans = max(ans , dfs(pos+f[i] , t+1)+G[pos][t]);
return dp[pos][t] = ans;
}
int main () {
int cntn;
while (scanf("%d" , &cntn) != EOF && cntn) {
n = 0;
memset(dp,0,sizeof(dp));
memset(G,0,sizeof(G));
while(cntn--) {
int tp , tt;
scanf("%d%d" , &tp , &tt);
G[tp][tt]++;
n = max(n,tt);
}
printf ("%d\n" , dfs(5,0));
}
}