题目:https://www.luogu.org/problemnew/show/P3004
似乎有点博弈的意思,但其实是DP;
f[i][j] 表示 i~j 的最优结果,就可以进行转移;
注意两个循环的顺序,要先算出 i+1 ,但要用之前的 j-1 ,所以一个倒序一个正序。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,f[5005][5005],s[5005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&s[i]); f[i][i]=s[i];s[i]+=s[i-1]; } for(int i=n;i;i--) for(int j=i+1;j<=n;j++) f[i][j]=max(s[j]-s[i-1]-f[i+1][j],s[j]-s[i-1]-f[i][j-1]); printf("%d",f[1][n]); return 0; }
本文详细解析了洛谷P3004问题的动态规划解决方案,通过双层循环实现状态转移,计算i到j区间内的最优结果。关键在于正确设置循环顺序,确保每次计算都基于已知的最优子结构。
629

被折叠的 条评论
为什么被折叠?



