挖矿石


试题描述

已知藏宝图上标有若干个排成一条直线的魔法石矿,每个矿里有一定数量的魔法石,如表所示:

藏宝图上还给出挖完每个矿之后可以挖哪些矿。挖矿规则为可以从任何一个矿开始,到任何一个矿结束。同时挖完这个矿后,只能选择一个后续的矿继续挖,并且只能向右挖,不能回头向左挖。请问如何能挖出最多的矿石。

输入
第一行为一个整数n,表示有n(n<=1000)个矿。第二行为n个整数,表示这n个矿里面的魔法石数。随后n行表示每个矿挖完后还能再挖哪些矿。
输出
最多挖出的魔法石数
输入示例
3 1 1 1 1 2 3 2 3 3
输出示例
3
#include 
#include 
#define MAXN = 100 + 10
using namespace std;
long long a[10010],dp[10010],book[1010][1010],flag[10010];
int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        char c;
        int x;
        cin>>x;
        if(i!=x)
            book[i][x]=1;
        while(1)
        {
            c=getchar();
            if(c==' ')
            {
                cin>>x;
                if(i!=x)
                    book[i][x]=1;
            }
            if(c=='\n')
                break;
        }
    }
    for(int i=1;i<=n;i++)
        dp[i]=a[i];
    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cout<*/
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            if(book[i][j]==1)
                dp[j]=max(dp[j],dp[i]+a[j]);
    sort(dp,dp+n+1);
    cout<<dp[n];
    //system("pause");
}
/*
if(book[i][j]==1)
{
    dp[i]=max();
}
1 2 3 
1 2 5

*/