标签:style blog http io color os sp for div
先看题:http://acm.hdu.edu.cn/showproblem.php?pid=1176
这道题的状态转移方程不难找到dp[i][j] += max(dp[i + 1][j + 1],dp[i-1][j+1],dp[i][j+1]) 表示在第j秒的时候在i这个位置能接到的馅饼数 可是有两个特殊位置 0和10,这两个位置的状态转移方程需要另写dp[0][j] += max(dp[0][j+1],dp[1][i+1]) dp[10][j] += max(dp[10][j+1],dp[9][i+1]);
但是需要注意的是我们这个递推一定要从时间的最后开始推 不然也没法推 下面看代码
#include<iostream> #include <algorithm> #include<stdio.h> #include<string.h> using namespace std; int dp[11][100001]; inline int Max(int a, int b, int c=-1) //这个函数很有意思 可以求两个数中最大的也可以求三个数最大的 可以研究研究 { if(a < b) a = b; if(a < c) a = c; return a; } int main() { int n, i, j; int t, x; while (~scanf("%d", &n)&& n) { memset(dp, 0, sizeof(dp)); int MaxTime = 0; for (i=0; i<n; i++) { scanf("%d%d", &x, &t); dp[x][t]++; MaxTime = t>MaxTime ? t:MaxTime; //求最大时间是多少 } for (j=MaxTime-1; j>=0; j--) //j一定为最大时间-1 { dp[0][j] += Max(dp[0][j+1], dp[1][j+1]); dp[10][j] += Max(dp[10][j+1], dp[9][j+1]); for (i=1; i<10; i++) { dp[i][j] += Max(dp[i][j+1], dp[i+1][j+1], dp[i-1][j+1]); } } printf("%d\n", dp[5][0]); //输出5这个位置0秒时就行了 } return 0; }
标签:style blog http io color os sp for div
原文地址:http://www.cnblogs.com/zhanyage110/p/4120295.html