青蛙过桥-dp输出路径

【青蛙过桥-dp输出路径】这题dp也就罢了,还得输出路径,第一次做、、、

#include #include #include #include #include #include #include #include #include #include #define INF 0x3f3f3f3fusing namespace std; const int maxn=150000+10; int n; int arr[maxn],dp[maxn],Next[maxn],f[maxn]; vector 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; }




    推荐阅读