zoukankan      html  css  js  c++  java
  • 【动态规划】XMU 1560 新ACM规则

    题目链接:

      http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1560

    题目大意

      给定n(n<=200)个任务及每个任务的耗时,问m(m<=200)时间能够获得的最大收益(收益为解决连续任务数的平方的和,具体例子见题目)

    题目思路:

      【动态规划】

      设f[i][j]表示前i个任务,当前时间为j的最优值。

      枚举第i个任务是前有几个和i连续的任务,状态转移方程很好推。

      时间复杂度比O(n3)小很多,大概O(n2)级别。

     1 //
     2 //by coolxxx
     3 //
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<string>
     7 #include<iomanip>
     8 #include<memory.h>
     9 #include<time.h>
    10 #include<stdio.h>
    11 #include<stdlib.h>
    12 #include<string.h>
    13 #include<stdbool.h>
    14 #include<math.h>
    15 #define min(a,b) ((a)<(b)?(a):(b))
    16 #define max(a,b) ((a)>(b)?(a):(b))
    17 #define abs(a) ((a)>0?(a):(-(a)))
    18 #define lowbit(a) (a&(-a))
    19 #define sqr(a) ((a)*(a))
    20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
    21 #define eps 1e-8
    22 #define J 10000
    23 #define MAX 0x7f7f7f7f
    24 #define PI 3.1415926535897
    25 #define N 204
    26 using namespace std;
    27 int n,m,lll,ans,cas;
    28 int a[N],sum[N];
    29 int f[N][N];
    30 int main()
    31 {
    32     #ifndef ONLINE_JUDGE
    33 //    freopen("1.txt","r",stdin);
    34 //    freopen("2.txt","w",stdout);
    35     #endif
    36     int i,j,k;
    37     scanf("%d",&cas);
    38     while(cas--)
    39 //    while(~scanf("%s",s1))
    40 //    while(~scanf("%d",&n))
    41     {
    42         scanf("%d%d",&n,&m);
    43         memset(sum,0,sizeof(sum));
    44         memset(f,0,sizeof(f));
    45         for(i=1;i<=n;i++)
    46         {
    47             scanf("%d",&a[i]);
    48             sum[i]=sum[i-1]+a[i];
    49         }
    50         for(i=1;i<=n;i++)f[i][a[i]]=1;
    51         for(i=1;i<=n;i++)
    52         {
    53             for(j=0;j<=m;j++)f[i][j]=max(f[i][j],f[i-1][j]);
    54             for(j=a[i];j<=m;j++)
    55             {
    56                 f[i][j]=max(f[i][j],f[i][j-1]);
    57                 for(k=i;k && j>=sum[i]-sum[k-1];k--)
    58                 {
    59                     f[i][j]=max(f[i][j],f[k-1][j-sum[i]+sum[k-1]]+sqr(i-k+1));
    60                 }
    61             }
    62         }
    63         printf("%d
    ",f[n][m]);
    64     }
    65     return 0;
    66 }
    67 
    68 
    69 /*
    70 //
    71 
    72 //
    73 */
    View Code
  • 相关阅读:
    android onTouchEvent
    AD smart pdf 中文丢失
    c# 定时器
    Android 绘制圆环
    52道Python面试题
    螺旋填数:读入两个整数m,n,输出一个m行n列的矩阵,这个矩阵是1~m*n这些自然数按照右、下、左、上螺旋填入的结果。
    Java经典练习题_Day04
    Java经典练习题_Day05
    Java 面向对象 初探
    Java Array 方法和使用
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5426785.html
Copyright © 2011-2022 走看看