目前PAT甲级中涉及Dijkstra的题目有如下几题:
1007 Maximum Subsequence Sum (25) |
最大连续子序列和提供两种写法:
1.动态规划
(1)不记录起点和终点下标:
int a[maxn],dp[maxn];//a[i]存放序列,dp[i]存放以a[i]结尾的连续序列的最大和
dp[0]=a[0];
for(int i=1;i<n;i++){
//状态转移方程
dp[i]=max(a[i],dp[i-1]+a[i]);
}
//找出最大值
int k=0;
for(int i=1;i<n;i++){
if(dp[i]>dp[k]) k=i;
}
cout<<dp[k];
(2)记录起点和终点下标:
int a[maxn],dp[maxn];//a[i]存放序列,dp[i]存放以a[i]结尾的连续序列的最大和
int s[maxn];//s[i]表示产生dp[i]的连续序列从a的哪一个元素开始
dp[0]=a[0];
for(int i=1;i<n;i++){
//状态转移方程
if(d[i-1]+a[i]>a[i]){
dp[i]=dp[i-1]+a[i];
s[i]=s[i-1];
}else {
dp[i]=a[i];
s[i]=i;
}
}
//找出最大值
int k=0;
for(int i=1;i<n;i++){
if(dp[i]>dp[k]) k=i;
}
cout<<dp[k]<<" "<<a[s[k]]<<" "<<a[k];
2.非动态规划:
(1)不记录起点和终点下标: