ZOJ 2972 Hurdles of 110m
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2972
状态转移方程 前面推后面 跟gone finshing 有点。。。
代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> #define inf 1<<30 #include<algorithm> using namespace std; int dp[115][115]; int T1,T2,T3,F1,F2; int min(int a,int b) { return a<b?a:b; } int main() { int CASE,n,m,i,j,k; scanf("%d",&CASE); while(CASE--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=0;j<=m;j++) dp[i][j]=inf; dp[0][m]=0;//!!开始 for(i=0;i<n;i++) { scanf("%d%d%d%d%d",&T1,&T2,&T3,&F1,&F2); for(j=0;j<=m;j++) { if(j-F1>=0) dp[i+1][j-F1]=min(dp[i+1][j-F1],dp[i][j]+T1); dp[i+1][j]=min(dp[i+1][j],dp[i][j]+T2); if(j+F2<=m) dp[i+1][j+F2]=min(dp[i+1][j+F2],dp[i][j]+T3); if(j+F2>m) dp[i+1][m]=min(dp[i+1][m],dp[i][j]+T3); } } int MIN=inf; for(i=0;i<=m;i++) MIN=min(MIN,dp[n][i]); printf("%d\n",MIN); } return 0; }