SDUT 2169 Sequence dp减枝区间划分

来源:互联网 发布:网络推广邀约话术 编辑:程序博客网 时间:2024/04/29 04:34
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-family: 'microsoft yahei'; font-size: 14px; line-height: 17.5px; background-color: rgba(128, 128, 128, 0.0470588);">将区间分为m段,使得m段的平方和最小。 </span><br style="box-sizing: border-box; font-family: 'microsoft yahei'; font-size: 14px; line-height: 17.5px; background-color: rgba(128, 128, 128, 0.0470588);" /><span style="font-family: 'microsoft yahei'; font-size: 14px; line-height: 17.5px; background-color: rgba(128, 128, 128, 0.0470588);">我们定义一个Dp数组Dp[i][j]表示以i结尾,分为j段的最小和,那么对于区间[L+1,i],Dp[i][j] = min(Dp[i][j],Dp[L][j-1]+</span><span class="MathJax_Preview" style="color: rgb(136, 136, 136); box-sizing: border-box; font-family: 'microsoft yahei'; font-size: 14px; line-height: 17.5px; background-color: rgba(128, 128, 128, 0.0470588);"></span><span class="MathJax" id="MathJax-Element-24-Frame" role="textbox" aria-readonly="true" style="display: inline; font-size: 14px; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; box-sizing: border-box; font-family: 'microsoft yahei'; background-color: rgba(128, 128, 128, 0.0470588);"><nobr style="transition: none; box-sizing: border-box; border: 0px; padding: 0px; margin: 0px; max-width: none; max-height: none; min-width: 0px; min-height: 0px; vertical-align: 0px;"><span class="math" id="MathJax-Span-1" style="transition: none; box-sizing: border-box; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 5.26em;"><span style="transition: none; box-sizing: border-box; display: inline-block; position: relative; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 4.174em; height: 0px; font-size: 17.5px;"><span style="transition: none; box-sizing: border-box; position: absolute; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; clip: rect(1.089em 1000em 4.06em -0.454em); top: -2.797em; left: 0.003em;"><span class="mrow" id="MathJax-Span-2" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px;"><span class="munderover" id="MathJax-Span-3" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px;"><span style="transition: none; box-sizing: border-box; display: inline-block; position: relative; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 2.346em; height: 0px;"><span style="transition: none; box-sizing: border-box; position: absolute; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; clip: rect(1.889em 1000em 3.203em -0.454em); top: -2.797em; left: 0.631em;"><span class="mo" id="MathJax-Span-4" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0.003em; font-family: MathJax_Size1;">∑</span><span style="transition: none; box-sizing: border-box; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 0px; height: 2.803em;"></span></span><span style="transition: none; box-sizing: border-box; position: absolute; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; clip: rect(1.546em 1000em 2.574em -0.454em); top: -1.311em; left: 0.003em;"><span class="texatom" id="MathJax-Span-5" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px;"><span class="mrow" id="MathJax-Span-6" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px;"><span class="mi" id="MathJax-Span-7" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-size: 12.3725px; font-family: MathJax_Math-italic;">k</span><span class="mo" id="MathJax-Span-8" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-size: 12.3725px; font-family: MathJax_Main;">=</span><span class="mi" id="MathJax-Span-9" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-size: 12.3725px; font-family: MathJax_Math-italic;">L</span><span class="mo" id="MathJax-Span-10" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-size: 12.3725px; font-family: MathJax_Main;">+</span><span class="mn" id="MathJax-Span-11" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-size: 12.3725px; font-family: MathJax_Main;">1</span></span></span><span style="transition: none; box-sizing: border-box; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 0px; height: 2.231em;"></span></span><span style="transition: none; box-sizing: border-box; position: absolute; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; clip: rect(1.317em 1000em 2.231em -0.511em); top: -3.026em; left: 1.031em;"><span class="mi" id="MathJax-Span-12" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-size: 12.3725px; font-family: MathJax_Math-italic;">i</span><span style="transition: none; box-sizing: border-box; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 0px; height: 2.06em;"></span></span></span></span><span class="mi" id="MathJax-Span-13" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.174em; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">a</span><span class="mo" id="MathJax-Span-14" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">[</span><span class="mi" id="MathJax-Span-15" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">k</span><span class="mo" id="MathJax-Span-16" style="transition: none; box-sizing: border-box; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">]</span></span><span style="transition: none; box-sizing: border-box; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 0px; height: 2.803em;"></span></span></span><span style="transition: none; box-sizing: border-box; display: inline-block; position: static; border-width: 0px 0px 0px 0.004em; border-left-style: solid; border-color: initial; padding: 0px; margin: 0px; vertical-align: -1.425em; overflow: hidden; width: 0px; height: 3.361em; color: rgb(255, 255, 255);"></span></span></nobr></span><span style="font-family: 'microsoft yahei'; font-size: 14px; line-height: 17.5px; background-color: rgba(128, 128, 128, 0.0470588);">)</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span>
<span style="font-family: Arial, Helvetica, sans-serif;">#include<bits/stdc++.h></span>
#define LL long long#define INF 0x3f3f3f3fusing namespace std;LL dp[1010][1010];LL sum[1010];int main(){    int T;    while(~scanf("%d",&T))    {        while(T--)        {            int n,m;            scanf("%d%d",&n,&m);            int a;            memset(dp,INF,sizeof(dp));            dp[0][0]=0;            for(int i=0;i<=m;i++)                dp[i][0]=0;            for(int i=0;i<=n;i++)                dp[0][i]=0;            for(int i=1;i<=n;i++)            {                scanf("%d",&a);                sum[i]=sum[i-1]+a;                dp[1][i]=sum[i]*sum[i];  /// i个数分成一组            }            for(int i=2;i<=m;i++)            {                ///减枝     ///j<=n-m+i:因为当n个数分成m组时是用不到n个数分成m-1组的情况,                                          ///   最多会用到 小问题n-1个数分成m-1组,同理;所以用n个数算m-1,m-2,m-3,m-4...组都是多余的                for(int j=i;j<=n-m+i;j++)                    {                    for(int k=i-1;k<=j-1;k++)                    {                        dp[i][j]=min(dp[i][j],dp[i-1][k]+(sum[j]-sum[k])*(sum[j]-sum[k]));                    }                }            }            printf("%lld\n",dp[m][n]);            ///可以写成一维                        ///            ///            for(int i=2;i<=m;i++)   ///更快///            {               ///                                      ///                for(int j=i;j<=n-m+i;j++)    ///               {///                    for(int k=j-1;k>=i-1;k--)     ///倒着///                    {///                           if((sum[j]-sum[k])*(sum[j]-sum[k])>=dp[i][j]) break;         ///双重减枝,说明已经找到小的了。
///                        dp[i][j]=min(dp[i][j],dp[i-1][k]+(sum[j]-sum[k])*(sum[j]-sum[k]));///                    }///                }///            }///            printf("%lld\n",dp[m][n]);        }    }    return 0;}

0 0
原创粉丝点击