您的位置:首页 > 其它

HDU 1176 - 免费馅饼

2011-11-10 12:19 267 查看
知识点:1、数塔;
                2、整数(int 型)输入外挂(可大大缩短数据输入的时间,对于数据庞大的题目效果显著)。
#include <cstdio>
#include <memory.h>

//整数输入外挂,减少时间
bool scan_d(int &n)
{
char i;
bool I=0;
i=getchar();
if(i==EOF) return 0;
while(i!='-'&&(i<'0'||i>'9'))
i=getchar();
if(i=='-') I=1,n=0;
else n=i-'0';
while(i=getchar(),i>='0'&&i<='9')
n=n*10+i-'0';
if(I) n=-n;
return 1;
}

//以时间和位置建立二维dp数组,第一维表示时间,第二维表示位置
int dp[100001][11];

int main()
{
int n;
while(scan_d(n),n)
{
memset(dp,0,sizeof(dp));
int x,t,max_t=0;
while(n--)
{
scan_d(x); //整数输入外挂函数调用
scan_d(t);
dp[t][x]++; //用输入数据初始化dp数组
if(max_t<t) max_t=t;
}

//对数塔dp进行处理
for(int i=max_t-1;i>=0;i--)
for(int j=0;j<=10;j++)
{
//状态转移方程:dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])
int tmp=dp[i+1][j];
//考虑 j==0 和 j==10 时的特殊情况
if(j&&tmp<dp[i+1][j-1]) tmp=dp[i+1][j-1];
if(j<10&&tmp<dp[i+1][j+1]) tmp=dp[i+1][j+1];
dp[i][j]+=tmp;
}

printf("%d\n",dp[0][5]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: