动态规划专项intermediate:UVa 10304

来源:互联网 发布:mac电脑怎样退出程序 编辑:程序博客网 时间:2024/06/08 04:22

这道题lrj的书上给出了相当详细的解释,为了图省事就直接用记忆化搜索O(n^3)的复杂度写了,极度之搓……最后4s+极度水的过了……

#include <iostream>#include <fstream>#include <cstring>#include <cstdio>using namespace std;#define M 300int dp[M][M];int f[M];int s[M];int n;int dfs(int i,int j){    if(dp[i][j]!=-1) return dp[i][j];    if(i==j)    {        if(i==1&&j==n) return 0;        else return dp[i][j]=f[i];    }    int &ans=dp[i][j];    int tmp=min(dfs(i+1,j),dfs(i,j-1));    for(int k=i+1;k<j;k++)        tmp=min(tmp,dfs(i,k-1)+dfs(k+1,j));    if(i!=1||j!=n) ans=tmp+s[j]-s[i-1];    else ans=tmp;    return ans;}int main(){    freopen("in.txt","r",stdin);    while(cin>>n)    {        s[0]=0;        for(int i=1;i<=n;i++)        {            cin>>f[i];            s[i]=s[i-1]+f[i];        }        memset(dp,-1,sizeof(dp));        cout<<dfs(1,n)<<endl;    }    return 0;}


原创粉丝点击