UESTC 1131

来源:互联网 发布:wps for mac破解版 编辑:程序博客网 时间:2024/06/03 06:39

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn=2e2;const int INF=1e8;int dp[maxn][maxn],vis[maxn][maxn],arr[maxn];int t,n;int dfs(int l,int r){    if(vis[l][r]) return dp[l][r];    if(l>=r) return dp[l][r]=0;    dp[l][r]=INF;    for(int i=l;i<r;i++)        dp[l][r]=min(dp[l][r],dfs(l,i)+dfs(i+1,r)+((arr[i]-arr[l-1])%100)*((arr[r]-arr[i])%100));//合并了两个礼物的处理。这里说下边界问题,DFS边界是前闭后开,i和i+1表示要消除的    vis[l][r]=1;//合并的处理:循环到i时,应该是合并i和i+1,上面以i为分界,两边求和取余,相当于都合并完了,只剩两件礼物。而这个状态转移方程取的就是区间里最后合并的两件礼物。    return dp[l][r];}int main(){    cin >> t;    while(t--)    {        cin >> n;        memset(vis,0,sizeof(vis));        memset(arr,0,sizeof(arr));        for(int i=1;i<=n;i++)        {            cin >> arr[i];            arr[i]+=arr[i-1];//求和        }        cout << dfs(1,n) << endl;    }    return 0;}
区间合并


原创粉丝点击