您的位置:首页 > 其它

zoj 2972 Hurdles of 110m

2015-11-11 13:48 211 查看
体力值最高为m,刚开始没看到,一直wa。

dp[i][j]:跑完前i个区域还剩j点体力值。

所以有四种情况:

用a[i][5]数组储存每一行输入的五个数。

- if(j+a[i][3]<=m) dp[i][j]=min(dp[i][j],dp[i-1][j+a[i][3]);

- dp[i][j]=min(dp[i][j],dp[i-1][j]);

- if(j-a[i][4]>=0) dp[i][j]=min(dp[i][j],dp[i-1][j-a[i][4]);

- 容易知道dp[i][m]可以由dp[i-1][j],(j+a[i][4]>=m)得到。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=150;
const int INF=1<<29;
int dp

;
int test;
int n,m;
int a
[5];
void init()
{
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
dp[i][j]=INF;
memset(dp[0],0,sizeof(dp[0]));
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>test;
while(test--)
{
cin>>n>>m;
init();
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4]);
for(int j=0;j<=m;j++)
{
if(j+a[i][3]<=m) dp[i][j]=min(dp[i][j],dp[i-1][j+a[i][3]]+a[i][0]);
dp[i][j]=min(dp[i][j],dp[i-1][j]+a[i][1]);
if(j-a[i][4]>=0) dp[i][j]=min(dp[i][j],dp[i-1][j-a[i][4]]+a[i][2]);
if(j+a[i][4]>=m) dp[i][m]=min(dp[i][m],dp[i-1][j]+a[i][2]);
//cout<<dp[i][j]<<" ";
}
//cout<<endl;
}
int minv=INF;
for(int i=0;i<=m;i++)
minv=min(minv,dp
[i]);
cout<<minv<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp