http://acm.nyist.net/JudgeOnline/problem.php?pid=613
1、构建二维数组:dp [time] [pos];
2、寻找转移方程:dp [time] [pos] = max( dp [time+1] [pos-1], dp [time+1] [pos], dp [time+1] [pos+1] ) + dp[time] [pos];
注意:数组越界,初始化的问题千万不能再犯了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<climits>
using namespace std;
#define MaxLen 100010
int dp[MaxLen][13];
int main(){
int m;
while(cin>>m){
if(m==0) break;
for(int i=0; i<MaxLen; i++){
for(int j = 0; j<12; j++){
dp[i][j] = 0;
}
}
int pos, value, t;
int maxT = 0;
for(int i=0; i<m; i++){
cin>>pos>>t;
maxT = max(maxT, t);
dp[t][pos+1]++;
}
for(int i=maxT-1; i>=0; i--){
for(int j = 1; j<=11; j++){
dp[i][j] = dp[i][j] + max(max(dp[i+1][j-1], dp[i+1][j]), dp[i+1][j+1] );
}
}
cout<<dp[0][6]<<endl;
}
return 0;
}
本文介绍了一种使用动态规划算法解决特定的时间序列问题的方法。通过构建二维数组dp[time][pos],并定义转移方程来求解最大值路径。文章提供了完整的C++代码实现,并详细解释了边界条件及初始化的注意事项。
789

被折叠的 条评论
为什么被折叠?



