题外话(可以跳过):
看了一些别的题解,我的好像和一些 Dalao 的思路 && 代码都很像,真不是我 Ctrl C + V 过来的……
正题:P6759 [USACO2006 OPEN] 县集市 The County Fair
题目
有 n n n 个摊位,每个摊位 i i i 在 p i p_i pi 时发放礼品。从第 i i i 个摊位走到第 j j j 个摊位需要 t i , j t_{i , j} ti,j,但反方向走时间可能不同。初始从第 0 个摊位出发,时间记为 0。
思路
一道简单的 dp 题,先把放出礼品的时间排序,然后 f i f_i fi 表示取第 i i i 个礼物时,前 i i i 个礼物能拿到的个数,则经过简单分类讨论后,有状态转移方程:
f i = max ( f j + 1 , f i ) f_i = \max(f_{j + 1} , f_i) fi=max(fj+1,fi)
上 AC(码风奇特,勿喷)
#include <bits/stdc++.h> //万能头
using namespace std; //命名空间
struct node //用结构体做的,也可以采用其他方法
{
int tim , num;
}a[1001]; //结构体数组
bool cmp(node x , node y) //后面sort要用到的排序规则
{
return x.tim < y.tim;
}
int f[1001] , t[1001][1001]; //一些数组
int main()
{
int n , ans; //两个变量,一个输入,一个输出
cin >> n; //输入
a[0].tim = 0; //初始化a[0]的tim
a[0].num = 1; //初始化a[0]的num
for(int i = 1; i <= n; i++) //一直到第45行都是输入
{
cin >> a[i].tim;
a[i].num = i;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
cin >> t[i][j];
}
}
sort(a + 1 , a + n + 1 , cmp); //排序
for(int i = 1; i <= n; i++) //其实真正的代码就这一个循环,过一遍,处理一遍
{
for(int j = 0; j < i; j++)
{
if((t[a[j].num][a[i].num] + a[j].tim) <= a[i].tim)
{
f[i] = max(f[i] , f[j] + 1);
}
}
}
for(int i = 1; i <= n; i++) //打一遍擂台找最大值
{
ans = max(ans , f[i]);
}
cout << ans << endl; //输出
return 0; //完美结束Perfect
}