2 条题解

  • 0
    @ 2025-10-8 16:51:56
    #include<bits/stdc++.h>
    using namespace std;
    int a[21], dp[21], mp[21][21], nxt[21];
    int main()
    {
        int n;scanf("%d", &n);
        memset(dp, 0, sizeof(dp));
        for(int i=1;i<=n;i++) scanf("%d", &a[i]), dp[i]=a[i];
        for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++) scanf("%d", &mp[i][j]);
        
        for(int i=n-1;i>=1;i--)for(int j=i+1;j<=n;j++)if(mp[i][j])
            if(dp[i]<dp[j]+a[i])
            {
                dp[i]=dp[j]+a[i];
                nxt[i]=j;
            }
    
        int t=1;for(int i=2;i<=n;i++)if(dp[i]>dp[t]) t=i;
        int ans=dp[t];
        while(t!=0)
        {
            printf("%d ", t);
            t=nxt[t];
        }
        printf("\n");
        printf("%d\n", ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:51:49
      #include<bits/stdc++.h>
      using namespace std;
      int a[21],dp[21],mp[21][21],nxt[21];
      int main()
      {
          int n;scanf("%d",&n);
      	memset(dp,0,sizeof(dp));
          for(int i=1;i<=n;i++) scanf("%d",&a[i]),dp[i]=a[i];
          for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++) scanf("%d",&mp[i][j]);
          
          for(int i=n-1;i>=1;i--)for(int j=i+1;j<=n;j++)if(mp[i][j])
              if(dp[i]<dp[j]+a[i])
              {
                  dp[i]=dp[j]+a[i];
                  nxt[i]=j;
              }
      
          int t=1;for(int i=2;i<=n;i++)if(dp[i]>dp[t]) t=i;
          int ans=dp[t];
          while(t!=0)
          {
              printf("%d ",t);
              t=nxt[t];
          }
          printf("\n");
          printf("%d\n",ans);
          return 0;
      }
      • 1

      *【动态规划练习】挖地雷[NOIP提高组1996]

      信息

      ID
      683
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      15
      已通过
      12
      上传者