题目描述:
一个人去n个湖钓鱼,第i个湖里初始时一个单位时间可以钓fi条鱼,下一个单位时间钓的鱼数量递减di。湖的排列是线性的,从第i个湖走到第i+1个湖需要ti的时间。现在有m时间可用,初始在第一个湖,问最多可以钓多少鱼。
分析:
很明显题目条件满足无后效性,可以用动态规划来解决。
设dp[i][j]表示在前i个湖花费j的时间最多钓鱼数量(并停留在第i个湖)。getFish(i,t)表示在第i个湖花费t时间总共获得的鱼数量。
状态转移方程:dp[i][j] = max{ dp[i-1][j-t[i]-k]+getFish(i,k) },k表示在第i个湖停留k时间。
程序要特别注意循环变量的边界条件。郁闷的是居然PE了两次……
另外,这个题目在刘汝佳的黑书上有讲,方法是枚举+贪心,效率比动态规划高很多。
/* ZJU1161 Gone Fishing */ #include #include #define N 30 #define M 400 #define clr(a) memset(a,0,sizeof(a)) #define MIN(a,b) ((a)>(b)?(b):(a)) #define MAX(a,b) ((a)>(b)?(a):(b)) int n,m; int f[N],d[N],t[N]; int reach[N]; int dp[N]