题意没申清 刚开始以为在s点s+1和s-1的馅饼也可以捡和0和10不能到(题意坑也不说清楚)最后发现就是水DP。。。
没做任何优化除了用了个滚动数组。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int dp[2][13];
int th[100005][13],a,b,c;
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(th,0,sizeof(th));
int ma = -1;
while(n--)
{
scanf("%d%d",&a,&b);
th[b][a]++;
ma = max(ma,b);
}
int pre = 0;
for(int i=0;i<=1;i++)
for(int j=0;j<=10;j++)
dp[i][j] = -9999999;
dp[pre][5] = 0;
for(int i=1;i<=ma;i++)
{
pre = 1-pre;
for(int j=1;j<=9;j++)
dp[pre][j] = max(dp[1-pre][j],max(dp[1-pre][j-1],dp[1-pre][j+1]))+th[i][j];
dp[pre][0] = max(dp[1-pre][0],dp[1-pre][1])+th[i][0];
dp[pre][10] = max(dp[1-pre][10],dp[1-pre][9])+th[i][10];
}
int ans = -1;
for(int i=1;i<=9;i++)
ans = max(ans,dp[pre][i]);
printf("%d\n",ans);
}
}
滚动数组优化的DP算法
本文介绍了一种使用滚动数组优化的动态规划(DP)算法解决特定问题的方法。该问题涉及在一系列位置上选择最优路径以收集最多的资源,通过动态规划求解最大收益。文章通过代码示例详细展示了算法实现过程。
223

被折叠的 条评论
为什么被折叠?



