您的位置:首页 > 运维架构

bzoj1916[Usaco2010 Open]冲浪

2017-05-13 15:37 387 查看
一开始吓得我以为要用期望,后来发现好像不用。。

然后就想歪了,一看最大最小直奔二分,结果发现好像并不可做(sb的不行。。)

后来sb的我去看了一波题解才发现这是个水题,,智商啊woc。。。

设f(x,y)表示走到x,已经失控了y次或者还剩y次失控,直接通过dfs推就可以了,两种都是可以得。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define inf 0x3f3f3f3f3f3f3f3fll
using namespace std;
const int N=3e5+5;
typedef long long ll;
int n,m,k;
int head
,next
,go
;
ll val
;
ll w
,dp
[11];
int tot;
inline void add(int x,int y,int z)
{
go[++tot]=y;
val[tot]=z;
next[tot]=head[x];
head[x]=tot;
}
inline void init()
{
memset(head,0,sizeof(head[0])*(n+1));
tot=0;
fo(i,1,m)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
}
inline ll dfs(int x,int y)
{
if (dp[x][y]!=inf)return dp[x][y];
ll ans=0,mn=inf;
for(int i=head[x];i;i=next[i])
{
ans=max(ans,dfs(go[i],y)+val[i]);
if (y<k)mn=min(mn,dfs(go[i],y+1)+val[i]);
}
ans=min(ans,mn);
return dp[x][y]=ans;
}
inline void solve()
{
memset(dp, 0x3f, sizeof(dp));
memset(dp
,0,sizeof(dp
));
printf("%lld\n",dfs(1,0));
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
init();
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: