您的位置:首页 > 其它

HDU1176-基础dp-免费馅饼

2017-07-23 20:13 363 查看
https://vjudge.net/contest/170788#problem/G

看来我也只会写这种基础的dp了qwq

中文题意。

直接递推。

dp[i][j]为i秒j位置的最优解。

而在i秒j位置总共就这几种来源。。找一个最大的。

注意,开始没有注意起始位置,wa了两发。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e5+5;
int mp[maxn][12];
int dp[maxn][12];
int main()
{   int t;
int a,b;
while(~scanf("%d",&t)){
if(!t) break;
memset(mp,0,sizeof(mp));
int bb=-1;
for(int i=0;i<t;i++){
scanf("%d%d",&a,&b);
mp[b][a]+=1;
bb=max(b,bb);
}
memset(dp,0,sizeof(dp));
dp[1][5]=mp[1][5];
dp[1][4]=mp[1][4];
dp[1][6]=mp[1][6];
for(int i=2;i<=bb;i++){
for(int j=0;j<=10;j++){
if(j>0)
dp[i][j]=max(dp[i-1][j-1],dp[i][j]);
if(j<10)
dp[i][j]=max(dp[i-1][j+1],dp[i][j]);
dp[i][j]=max(dp[i-1][j],dp[i][j]);
dp[i][j]+=mp[i][j];
}
}
int ans=-1;
for(int i=0;i<=10;i++)
ans=max(ans,dp[bb][i]);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: