DP基础吧。A掉还是挺爽的。就是考虑在两端只能是从前一秒的内部一米或原来的点来进行,但是在5秒以内可到达点是逐渐外扩的,并不是[0,10],所以就特殊考虑了一下。后面两端是0和10,中间的点可以从上一秒的左边/本身/右边过来,保证每次最优这样下来就好了。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const double pi = acos(-1.0); const int mod =9973; const int N = 1e5+10; int n;
int dp[5][20];
int a[N][20]; int main()
{
int k,x,y,T;
while(~scanf("%d",&n)&&n)
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
T=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
a[y][x]++;
T=max(T,y);
} /*for(int i=1;i<=T;i++)
{
for(int j=0;j<=10;j++)
printf("%d ",a[i][j]);
puts("");
}
puts("");
*/ k=0;
dp[k][4]=a[1][4];
dp[k][5]=a[1][5];
dp[k][6]=a[1][6]; /* for(int i=0;i<=10;i++)
printf("%d ",dp[k][i]);
puts("");*/
if(T<=5)
{
for(int i=2;i<=T;i++)
{
k=1-k;
for(int j=(5-i);j<=(5+i);j++)
{
if(j==(5-i))
dp[k][j]=a[i][j]+dp[1-k][j+1];
else if(j==(5+i))
dp[k][j]=a[i][j]+dp[1-k][j-1];
else
dp[k][j]=max(dp[1-k][j],max(dp[1-k][j+1],dp[1-k][j-1]))+a[i][j];
}
}
int ans=0;
for(int i=0;i<=10;i++)
ans=max(ans,dp[k][i]);
printf("%d\n",ans);
continue;
}
for(int i=2;i<=5;i++)
{
k=1-k;
for(int j=(5-i);j<=(5+i);j++)
{
if(j==(5-i))
dp[k][j]=a[i][j]+dp[1-k][j+1];
else if(j==(5+i))
dp[k][j]=a[i][j]+dp[1-k][j-1];
else
dp[k][j]=max(dp[1-k][j],max(dp[1-k][j+1],dp[1-k][j-1]))+a[i][j];
}
}
for(int i=6;i<=T;i++)
{
k=1-k;
for(int j=0;j<=10;j++)
{
if(j==0)
dp[k][j]=a[i][j]+max(dp[1-k][j],dp[1-k][j+1]);
else if(j==10)
dp[k][j]=a[i][j]+max(dp[1-k][j],dp[1-k][j-1]);
else
dp[k][j]=max(dp[1-k][j],max(dp[1-k][j+1],dp[1-k][j-1]))+a[i][j];
} }
int ans=0;
for(int i=0;i<=10;i++)
ans=max(ans,dp[k][i]);
printf("%d\n",ans);
}
return 0;
}

后来我又写了一发发现其实没有必要考虑前五秒的路线,反正我前一状态没有走过就是0,那么就算本来前五秒过程中走不到的地方,我也当成走到了,反正前一状态就是0;

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define MAX 100010
#define mod 9973
#define LL long long const int N=1e5+10; int a[N][20];
int dp[5][20]; int main()
{
int n,x,y,k;
while(~scanf("%d",&n)&&n){ memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp)); int T;
T=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
a[y][x]++;
T=max(T,y);
} k=1;
dp[k][5]=a[1][5];
dp[k][4]=a[1][4];
dp[k][6]=a[1][6]; for(int i=2;i<=T;i++)
{
k=1-k;
for(int j=10;j>=0;j--){
if(j==0){
dp[k][j]=a[i][j]+max(dp[1-k][j+1],dp[1-k][j]);
}
else if(j==10){
dp[k][j]=a[i][j]+max(dp[1-k][j-1],dp[1-k][j]);
}
else
dp[k][j]=a[i][j]+max(dp[1-k][j-1],max(dp[1-k][j+1],dp[1-k][j]));
}
} int ans=dp[k][0];
for(int i=0;i<=10;i++)
{
ans=max(ans,dp[k][i]);
}
cout<<ans<<endl;
}
return 0;
}

最新文章

  1. nodejs、npm、grunt——名词解释
  2. MongoDB安装并随windows开机自启
  3. Linux安装MySql.Data for mono
  4. [TYVJ]1519 博彩
  5. Javascript模块化编程(二):AMD规范【转】
  6. jq实现竞拍倒计时
  7. SPI,UART,I2C都有什么区别,及其各自的特点
  8. POJ1961Period
  9. 配置 nginx location 实时查看 php-fpm 的状态
  10. MySQL性能优化之参数配置
  11. java 线程二
  12. 一起学Android之ViewPager
  13. Linux 我的常用命令记录
  14. 理解SQL的左连接与右连接
  15. 9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】
  16. IDEA乱码解决
  17. JoyOI1391 走廊泼水节
  18. 1.cassandra的搭建
  19. Shiro权限总结
  20. Golang实现一个密码生成器

热门文章

  1. 安卓执行机制JNI、Dalvik、ART之间的比較 。android L 改动执行机制。
  2. vc常用类总结(转载)
  3. 嵌入式程序员应知道的0x10个C语言Tips
  4. 一句话说清楚啥是delegate
  5. [LightOJ 1018]Brush (IV)[状压DP]
  6. C++结构体中使用函数与类中使用函数小结
  7. wxpython中鼠标样式的获取与匹配
  8. android控件之间事件传递
  9. React创建组件的三种方式比较和入门实例
  10. IOS中UIAlertView(警告框)常用方法总结