题目描述
题目描述:
君不知,打靶大牛goleenuoer可喜欢打水漂了,他的靶子可以打到河面上的任何一条鱼,可是他的水漂打得实在是烂,无论怎么打那石子只会在河面上跳跃两次就“扑通”了.这天他又来打了.这条宽w米,每隔一米都会有一条鱼,每条鱼都有它的美观值.他想知道如何打才能得到两条鱼之间最大的美观值总和.刚接触OI的他想请您来解答,您能帮助他吗???
输入格式
输入文件包含n+1个整数,第一行为一个整数n(n<=10000).从第二行工n个数,第i个整数表示第i条鱼的美观值范(围为-500..500).当所有整数都为负数时输出0.
输出格式
输出文件包含两行,第一行为石子的起点和落点,用空格隔开.第二行为一个整数表示所得到的两条鱼之间美观值总和.
题解:
用动态规划求最大加权线的问题。
代码实现:
#include<iostream> #include<cstring> using namespace std; int f[10001]={0},n; int main() { int i,j; cin>>n;bool p=1; for(i=1;i<=n;i++) {cin>>f[i];if(f[i]>=0) p=0;} if(p==1) {cout<<0<<endl;return 0;} for(i=1;i<=n;i++) f[i]+=f[i-1]; int ans=-100000,x,y; for(i=1;i<=n;i++) for(j=1;j<=i;j++) if(f[i]-f[j-1]>ans) {ans=f[i]-f[j-1];x=j;y=i;} cout<<x<<" "<<y<<endl<<ans<<endl; return 0; }