每日一贴,今天的内容关键字为位置子段
这个标题的印象是较比刻深的,我的第一个动态规划标题,也是ACM的开始。最大字段和是较比经典的动归问题。求一个列序的最大子段和的关键点就在于断判一个元素的归属问题,dp[i]表现含包第i个元素的最大子段和的结果,对于元素a[i],如果dp[i-1]>0那么加上dp[i-1]是有利益的,反之dp[i-1]就是赘累。这个标题有一个很好地问法,就是问你这个子段的肇端位置和束结位置。很简单,录记一下束结位置,然后根据你的动归转移方程和自己的思惟就可以失掉这个列序的肇端位置和束结位置。面下看代码。
#include<iostream> using namespace std; int a[100001],b[100001]; int main() { int T,i,k,max,n,j,e; cin>>T; for(i=1;i<=T;i++) { cin>>a[0]; for(k=1;k<=a[0];k++) cin>>a[k]; max=a[1]; b[1]=a[1]; j=1; for(n=2;n<=a[0];n++) { if(b[n-1]<0) b[n]=a[n]; else b[n]=b[n-1]+a[n]; if(b[n]>max) { max=b[n]; j=n; } } if(max<0) cout<<"Case "<<i<<":"<<endl<<max<<" "<<j<<" "<<j<<endl; else { for(e=j-1;e>0;e--) if(b[e]<0) break; cout<<"Case "<<i<<":"<<endl<<max<<" "<<e+1<<" "<<j<<endl; } if(i<T) cout<<endl; } return 0; }
文章结束给大家分享下程序员的一些笑话语录:
问答
Q:你是怎么区分一个内向的程序员和一个外向的程序员的? A:外向的程序员会看着你的鞋和你说话时。
Q:为什么程序员不能区分万圣节和圣诞节? A:这是因为 Oct 31 == Dec 25!(八进制的 31==十进制的 25)