这题dp也就罢了,还得输出路径,第一次做、、、
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=150000+10;
int n;
int arr[maxn],dp[maxn],Next[maxn],f[maxn];
vector<int> vt;
int main()
{
scanf("%d",&n);
memset(arr,0,sizeof(arr));
memset(dp,INF,sizeof(dp));
memset(Next,0,sizeof(Next));
for(int i=0; i<=n; i++)
scanf("%d",&arr[i]);
dp[n+1]=0;//处理边界
dp[n-1]=arr[n-1];
dp[n-2]=arr[n-2];
dp[n]=arr[n];
for(int i=n-3; i>=0; i--)
{
for(int j=3;j>=1;j--)
{
if(dp[i]>=dp[i+j]+arr[i])
{
dp[i]=dp[i+j]+arr[i];
Next[i]=i+j;//每次只记录最优的下一个点的下标
}
}
}
printf("%d\n0",dp[0]);
for(int i=Next[0];i;i=Next[i])//输出路径
printf(" %d",i);
printf("\n");
return 0;
}