题目链接:
题目大意:
给出一个初始速度,一个结束的速度,给出两秒的速度的最大的差值,给出行驶的时间,问中途的行驶距离最大是多少?
题目分析:
- 定义状态dp[i][j]表示在第i秒速度是j的最远行驶距离。
- 比较好理解,转移方程如下:
dp[i][j]=maxk=max(j−d,0)j+d(dp[i−1][k]+k)
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 107
using namespace std;
int v1,v2,t,d;
int dp[MAX][MAX*15];
int main ()
{
while ( ~scanf ( "%d%d%d%d" , &v1 , &v2 , &t , &d ) )
{
memset ( dp , 0x9f , sizeof ( dp ));
int mark = dp[0][0];
dp[1][v1] = 0;
for ( int i = 1; i < t ; i++ )
for ( int j = 0 ; j <= 1100 ; j++ )
{
if ( dp[i][j] != mark )
for ( int k = -d ; k <= d ; k++ )
{
if ( j+k < 0 ) continue;
dp[i+1][j+k] = max ( dp[i][j] + j , dp[i+1][j+k] );
}
}
printf ( "%d\n" , dp[t][v2]+v2 );
}
}