线性dp 杭电oj 1176
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n;
while (scanf("%d",&n)==1&&n!=0){
vector<int>Pos(n), Time(n);
int Max = 0;
int ans = 0;
for (int i = 0; i < n; ++i) {
scanf("%d%d", &Pos[i], &Time[i]);
if (Time[i] > Max)Max = Time[i];
}
vector<vector<int>>dp( Max+1, vector<int>(11, -1));
dp[0][5] = 0;
for(int i = 0; i < n; ++i){
if(dp[Time[i]][Pos[i]] == -1){
dp[Time[i]][Pos[i]] = 0;
}
dp[Time[i]][Pos[i]]++;
}
for(int t = 1; t <= Max; ++t) {
for(int p = 0; p < 11; ++p) {
int now = dp[t][p];
for(int k = -1; k <= 1; ++k){
if(p + k >= 0 && p + k < 11&&dp[t-1][p+k]!=-1) {
if(now == -1) now = 0;
dp[t][p] = max(dp[t][p], dp[t-1][p+k] + now);
}
}
}
}
for(int i = 0; i < 11; ++i) {
if(dp[Max][i] != -1){
ans = max(ans, dp[Max][i]);
}
}
printf("%d\n", ans);
}
return 0;
}
一直Wrong Answer