Sum of product

原创 2013年12月04日 12:01:33

先观察题目所给出的数据;10^6个数据;

显然可知O( n ^ 2 )也会超时;

先根据题解写出3重暴力算法用于验证;

通过一定的推算;可以看出i和j确定时,j + 1~ n每一项的和均需要成上num[ i ] * num[ j ]求和就为题解,可优化至O(n ^ 2 ),通过预处理前m项的和,减少一次for循环;


再进行优化;最简单的优化方式,同理,优化成分段求和相乘,即仿照O(n ^ 2 )优化方法,可发现确定i和j的断点,分成相应的三段,同理区间求和相乘即可,最终可优化至O( n );


证明:

例如:给定n个数据,分别为num[ 0 ], num[ 1 ], .............num[ n ];

可以发现

            t1 = num[ i ] * (  num[ i - 1 ] * ( num[ i - 2 ] + num[ i - 3 ] + ...... + num[ 2 ] + num[ 1 ] )     + num[ i - 2 ] * ( num[ i - 3 ] + num[ 4 ] + ..... + num[ 2 ] + num[ 1 ] )  +.......... + num[ 2 ] * num[ 1 ] );

            t2 = num[ i - 1 ] * ( num[ i - 2 ] * (  num[ i - 3 ] + ........+num[ 2 ] + num[ 1 ] ) + num[ i - 3 ] * ( num[ i - 4 ] +num[ i - 5 ] + ..... +num[ 2 ] + num[ 1 ] ) + .........+num[ 2 ] * num[ 1 ] );

           。

           。

           。

           。

           。

           t( n - 2 )=  num[  3 ] * ( num[ 2 ] * num[ 1 ] );

sum = t1 + .......+ t( n - 2 );


// Sum of product.cpp : ??????????????
//

//#include "stdafx.h"
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int maxn = 1000005;
typedef long long LL;
#define Mod 1000000007
LL num[ maxn ], sum[ maxn ], dp[ maxn ];

//int _tmain(int argc, _TCHAR* argv[])
int main()
{
    int n;
    while( scanf( "%lld", &n ) != EOF  ){
        memset( sum, 0, sizeof( sum ) );
        for( int i = 1; i <= n; ++i ){
            ///cin >> num[ i ];
            scanf( "%lld", &num[ i ] );
            sum[ i ] = ( sum[ i - 1 ] + num[ i ] ) % Mod;
            if( i > 2 ){
                dp[ i ] = ( ( num[ i - 1 ] * sum[ i - 2 ] ) % Mod + dp[ i - 1 ] % Mod ) % Mod;
            }
        }
        LL ans = 0;
        for( int i = n; i > 2; --i ){
            ans += ( dp[ i ] * num[ i ] ) % Mod;
        }
        //cout << 6 * ans << endl;
        printf( "%lld\n", ( 6 * ans) % Mod );
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Cydia 出现“Hash Sum mismatch”报错解决方法

转:http://jb.appvv.com/news/19829.shtml "Hash Sum mismatch",哈希校验值总和不匹配。Cydia 常见报错之一。出现此情况后,再次下载时会从头开...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2015年07月10日 14:39
  • 6150

Android编译系统环境初始化过程分析

转自: http://www.cnblogs.com/android100/p/android-compile.html
  • tdstds
  • tdstds
  • 2014年05月14日 18:24
  • 6471

mysql之innodb存储引擎特性汇总

InnoDB存储引擎 ·遵循ACID,支持commit,rollback和故障恢复,是事务安全的 ·行级锁定,Oracle-style读一致性改善了多用户并发操作性能 ·支持FOREIGN KE...
  • jolly10
  • jolly10
  • 2013年11月18日 17:25
  • 1554

【Smart OJ P2485】Sum of product 简单数学

描述 Descript.对于A1,A2,…..,AN,求 的值。输入 Input第1 行,1 个整数N。 第2 行,N 个整数A1,A2,…..,AN。输出 Output1 个整数,表示所求的...
  • LOI_DQS
  • LOI_DQS
  • 2015年10月28日 19:23
  • 559

371. Sum of Two Integers\318. Maximum Product of Word Lengths\208. Implement Trie\201.Bitwise AND

Sum of Two Integers DESCRIPTION IMPLEMENTATION Maximum Product of Word Lengths DESCRIPTION IMPLEMENT...
  • c602273091
  • c602273091
  • 2017年04月09日 11:29
  • 312

Factor Graphs and the Sum-Product Algorithm

  • 2016年03月08日 11:33
  • 459KB
  • 下载

CodeForces 631E Product Sum(斜率优化DP+二分|三分) ★

题意:给出n个数,现在可以移动一个数的位置,现在要使和sigma(ai*i)最大,询问这个最大和。 思路:将一个数向左移动和向右移动是一样的,现在考虑向左移动。 先预处理出前缀和,将一个数向左移动后,...
  • Ezereal
  • Ezereal
  • 2016年09月07日 16:21
  • 710

CodeForces 631E Product Sum(斜率优化DP+二分|三分)

题意:给出n个数,现在可以移动一个数的位置,现在要使和sigma(ai*i)最大,询问这个最大和。 思路:将一个数向左移动和向右移动是一样的,现在考虑向左移动。 先预处理出前缀和,将一个数向左移动...
  • u014664226
  • u014664226
  • 2016年04月01日 19:24
  • 616

Sum vs Product(ACdream) —— dfs

I - Sum vs Product Time Limit: 4000/2000MS (Java/Others)     Memory Limit: 128000/64000KB (Java/O...
  • jxust_tj
  • jxust_tj
  • 2014年10月16日 08:06
  • 645

ACdream 1431 Sum vs Product

题目链接:http://115.28.76.232/problem?pid=1431 Sum vs Product Time Limit: 4000/2000MS (Java/...
  • asdfghjkl1993
  • asdfghjkl1993
  • 2014年10月06日 19:35
  • 904
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Sum of product
举报原因:
原因补充:

(最多只允许输入30个字)