zoukankan      html  css  js  c++  java
  • SP18637 LAWRENCE

    (color{#0066ff}{ 题目描述 })

    给定一个长度为n的序列,至多将序列分成m+1段,每段序列都有权值,权值为序列内两个数两两相乘之和。求序列权值和最小为多少?

    (color{#0066ff}{输入格式})

    第一行两个数 (n, m)

    第二行为序列

    (color{#0066ff}{输出格式})

    输出一行为最小权值和

    (color{#0066ff}{输入样例})

    4 1
    4 5 1 2
        
        
    4 2
    4 5 1 2
    

    (color{#0066ff}{输出样例})

    17
        
    2
    

    (color{#0066ff}{数据范围与提示})

    (n le 500, a_i le 20)

    (color{#0066ff}{题解})

    考虑一段的贡献,就是(sum)任意两个数乘机

    其实就是完全平方式, 所有数的和的平方减去所有数的平方和就是2倍的两两乘积之和

    再除以2就是区间的贡献

    不难设出状态(f[i][j])为前i个数,分成j段的最小权值和

    那么转移(f[i][j]=min{f[k][j-1]+((s[i]-s[k]) imes(s[i]-s[k])-(p[i]-p[k]))/2})

    通过打表发现,决策点是单调的,于是可以用四边形不等式进行优化

    记录一下决策点的位置,可以优化成(O(N^2))的复杂度

    #include<bits/stdc++.h>
    #define LL long long
    LL in() {
    	char ch; LL x = 0, f = 1;
    	while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
    	for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
    	return x * f;
    }
    const int maxn = 505;
    const int inf = 0x3f3f3f3f;
    int f[maxn][maxn], s[maxn], p[maxn], a[maxn], q[maxn][maxn];
    int n, k;
    int main() {
    	n = in(), k = in();
    	for(int i = 1; i <= n; i++) {
    		s[i] = s[i - 1] + (a[i] = in());
    		p[i] = p[i - 1] + a[i] * a[i];
    		f[i][0] = (s[i] * s[i] - p[i]) >> 1;
    	}
    	for(int i = 1; i <= k; i++) q[n + 1][i] = n;
    	for(int j = 1; j <= k; j++)	{
    		for(int i = n; i >= 1; i--) {
    			f[i][j] = inf;
    			for(int v = q[i][j - 1]; v <= std::min(i, q[i + 1][j]); v++) {
    				int now = f[v][j - 1] + (((s[i] - s[v]) * (s[i] - s[v]) - (p[i] - p[v])) >> 1);
    				if(f[i][j] > now) f[i][j] = now, q[i][j] = v;
    			}
    		}
    	}
    	printf("%d", f[n][k]);
    	return 0;
    }
    
  • 相关阅读:
    mac地址绑定
    解决php函数json_encode转换后中文被编码为unicode
    json格式转数组注意事项
    leetcode[93] Restore IP Addresses
    leetcode[92] Reverse Linked List II
    leetcode[91] Subsets II
    leetcode[90] Decode Ways
    leetcode[89] Merge Sorted Array
    leetcode[88] Gray Code
    leetcode[87] Partition List
  • 原文地址:https://www.cnblogs.com/olinr/p/10420059.html
Copyright © 2011-2022 走看看