题目来源于:洛谷
题目本质:动态规划dp
解题思路:设fi,j表示第i天到达城市j的最大收益。状态转移方程为:
f[i][j]=max(f[i][j],f[i-1][v]+a[j]);
代码入下:
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,c,cnt;
int head[N],f[N][N];
int ans;
int a[N];
struct edge{
int to,nex;
}e[N<<2];
void add(int x,int y){
e[++cnt].nex=head[x];
head[x]=cnt;
e[cnt].to=y;
}
int main(){
scanf("%d %d %d",&n,&m,&c);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
int x,y;
scanf("%d %d",&x,&y);
add(y,x);
}
memset(f,-1,sizeof(f));
f[0][1]=0;
for(int i=1;i<=1000;i++){
for(int j=1;j<=n;j++){
for(int k=head[j];k;k=e[k].nex){
int v=e[k].to;
if(~f[i-1][v]){
f[i][j]=max(f[i][j],f[i-1][v]+a[j]);
}
}
}
if(ans<f[i][1]-c*i*i){
ans=f[i][1]-c*i*i;
}
}
cout<<ans;
return 0;
}