【原】 POJ 2479 Maximum sum 动态规划 解题报告

 

http://poj.org/problem?id=2479


方法:两次dp+一次扫描,复杂度3*n
基于求最大连续子数组的线性dp算法
对数组从前往后各做一次O(n)的dp,求得maxsofar[0][0...n-1],再数组从后往前各做一次O(n)的dp,求得maxsofar[1][0...n-1],
再扫描一遍maxsofar求得maxsofar[0][i-1] + maxsofar[1][i]的最大值,即为结果

线性dp:将大问题转化为小问题来处理
对于数组a[0...n-1],a[n-1]和最终结果max subarray a[i...j]之间的关系可能有三种情况:
(1) i=j=n-1,则max subarray为a[n-1]
(2) i<j=n-1,则max subarray为a[i...n-1]
(3) i<j<n-1,则max subarray为a[i...j]
设maxendinghere[i]表示a[0..i]中包含a[i]的子数组的最大和,maxsofar[i]表示a[0...i]中最大子数组的和
因此可以看出大问题可转化为小问题来解决:a[0...i]的最大子数组的和是以下三者的最大值:
       a[i],a[0...i-1]中包含a[i-1]的最大子数组的和加a[i],a[0...i-1]的最大子数组的和
递归式为:maxsofar[i] = max( a[i] ,  maxendinghere[i-1]+a[i] , maxsofar[i-1] )       

 

Description

Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:

formula?tex=d%28A%29%3D%5Cmax_%7B1%5Cleq+s_1%5Cleq+t_1%3Cs_2%5Cleq+t_2%5Cleq+n%7D%5Cleft%5C%7B%5Csum_%7Bi%3Ds_1%7D%5E%7Bt_1%7Da_i%2B%5Csum_%7Bj%3Ds_2%7D%5E%7Bt_2%7Da_j%5Cright%5C%7D&driver=1

Your task is to calculate d(A).

Input

The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input. 
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.

Output

Print exactly one line for each test case. The line should contain the integer d(A).

Sample Input

1

10

1 -1 2 2 3 -3 4 -4 5 -5

Sample Output

13

Hint

In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer. 
Huge input,scanf is recommended.

 

   1: const int N = 50000 ;
   2:  
   3: int a[N] ;
   4: int maxsofar[2][N] ;
   5:  
   6: void run2479()
   7: {
   8:     int t,n,val ;
   9:     int i,j ;
  10:     int maxendinghere ;
  11:     int max ;
  12:     int sum ;
  13:  
  14:     scanf( "%d", &t ) ;
  15:     while( t-- && scanf( "%d", &n ) )
  16:     {
  17:         scanf( "%d", &a[0] ) ;
  18:         maxendinghere = a[0] ;
  19:         maxsofar[0][0] = a[0] ;
  20:         for( i=1 ; i<n ; ++i ) //输入数组的同时做从前往后的dp
  21:         {
  22:             scanf( "%d", &a[i] ) ;
  23:             maxendinghere = std::max( a[i] , maxendinghere+a[i] ) ;
  24:             maxsofar[0][i] = std::max( maxsofar[0][i-1] , maxendinghere ) ;
  25:         }
  26:  
  27:         maxendinghere = a[n-1] ;
  28:         maxsofar[1][n-1] = a[n-1] ;
  29:         max = maxsofar[0][n-2] + a[n-1] ;
  30:         for( i=n-2 ; i>0 ; --i ) //做从后往前的dp同时求得最大值
  31:         {
  32:             maxendinghere = std::max( a[i] , a[i]+maxendinghere ) ;
  33:             maxsofar[1][i] = std::max( maxsofar[1][i+1] , maxendinghere ) ;
  34:             sum = maxsofar[0][i-1] + maxsofar[1][i] ;
  35:             max = max>sum ? max : sum ;
  36:         }
  37:         printf( "%d\n" , max ) ;
  38:     }
  39: }

转载于:https://www.cnblogs.com/allensun/archive/2010/11/05/1870225.html

<think>好的,用户想了解HS400模式下200MHz的配置或相关信息。首先,我需要回忆HS400是什么,它属于eMMC规范中的高速接口模式。HS400代表High Speed SDR 400,支持双倍数据率(DDR),最高时钟频率200MHz,每个时钟周期传输两次数据,所以理论速度达到400MB/s。 接下来,配置HS400的步骤可能包括硬件和软件两方面。硬件上,设备必须支持HS400模式,PCB布线要符合信号完整性要求,比如走线长度匹配、阻抗控制。电源稳定性也很重要,因为高速信号对噪声敏感。 软件配置方面,首先需要初始化eMMC设备,设置总线宽度为8位,切换到HS200模式进行校准,再切换到HS400。可能需要调整驱动强度和采样点,确保信号质量。设备树(Device Tree)的配置是否正确,比如是否启用了HS400相关属性,也是关键。 还要考虑用户提到的引用内容,比如引用[4]中的存储测试工具,可能用memtester和fio来验证配置后的性能。此外,调试方法如示波器检查信号质量,以及查看内核日志确认模式切换是否成功,都是必要的步骤。 用户可能遇到的问题包括模式切换失败、数据错误或系统不稳定,需要逐一排查硬件设计、驱动配置和电源问题。最后,确保引用的相关信息正确,比如引用[4]中的测试工具是否适用于HS400的验证,可能需要补充说明。</think>### HS400 200MHz 模式配置信息 HS400(High Speed SDR 400)是eMMC 5.1及更高版本中定义的高速接口模式,通过200MHz时钟频率和双倍数据率(DDR)实现更高的传输速率。以下是相关配置信息: #### 1. **硬件要求** - **设备支持**:存储设备(如eMMC芯片)需支持HS400模式[^4]。 - **信号完整性**:200MHz高频信号对PCB布线要求严格,需确保走线长度匹配、阻抗控制(通常50Ω差分阻抗)及减少串扰。 - **电源稳定性**:需提供稳定的1.8V或3.3V电源,噪声需控制在±5%以内。 #### 2. **软件配置步骤** 1. **初始化模式切换**: - 从默认模式切换至HS200模式,完成信号校准。 - 通过CMD6命令切换至HS400模式,并启用8位总线宽度。 ```c // 示例:eMMC模式切换命令(Linux内核驱动参考) mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, HS400_TIMING); ``` 2. **驱动强度调整**:通过设备树(Device Tree)配置驱动强度采样点: ```dts &mmc { bus-width = <8>; mmc-hs400-1_8v; hs400-ds = "strength_high"; // 驱动强度 hs400-reduced-tx = <0>; // 采样点调整 }; ``` 3. **时钟配置**:确保主机控制器支持200MHz时钟输出,并配置PLL参数。 #### 3. **调试验证** - **信号质量测试**:使用示波器检查CLKDATA信号的眼图,确保建立/保持时间符合要求。 - **性能测试**:通过`fio`工具验证读写速度(引用[4]中提到的存储测试方法): ```bash fio --name=hs400_test --rw=randrw --bs=128k --direct=1 --ioengine=libaio --runtime=60 --numjobs=4 --group_reporting --filename=/dev/mmcblk0 ``` - **内核日志检查**:通过`dmesg`查看eMMC模式切换是否成功: ``` mmc0: new HS400 MMC card at address 0001 ``` #### 4. **常见问题优化** - **模式切换失败**:检查设备树配置或电压是否匹配。 - **数据错误**:优化PCB走线或调整驱动强度。 - **性能瓶颈**:启用命令队列(CQHCI)或优化DMA配置[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值