【JZOJ5263】分手是祝愿

Description

请注意本题的数据范围。

Input

Output

Sample Input

2
2
15 19
3
30 40 20

Sample Output

285
2600

Hint

数据范围:
30% n<=9
100% n,a<=100, T<=5

Source

动态规划 /DFS /分治

题解:

  区间DP裸题,注意a可以等于100.

代码:

  

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 1000
#define ll long long
#define mod 100
using namespace std;
ll a[MAXN],b[MAXN][MAXN],dp[MAXN][MAXN],num[MAXN][MAXN];
int n;

ll getit(int x,int y){
    ll ans=0;
    if(x>y) swap(x,y);
    if(y-x==0) return a[x];
    for(int i=x;i<=y;i++) ans=ans+a[i],ans%=mod;
    return ans;
}

void pre(){
    memset(num,0,sizeof(num));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            num[i][j]=num[j][i]=getit(i,j);
        }
}

ll DP(int l,int r){
    if(r-l+1==1) return 0;
    if(l>r) return 1ll<<50;
    if(b[l][r]) return dp[l][r];
    b[l][r]=1;
    for(int k=l;k<=r;k++){
        ll ret=1ll<<60;
        ret=DP(l,k)+DP(k+1,r)+num[l][k]*num[k+1][r];
        dp[l][r]=min(dp[l][r],ret);
    }
    return dp[l][r];
}

void work(){
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    pre();
    memset(dp,37,sizeof(dp));
    memset(b,0,sizeof(b));
    printf("%lld\n",DP(1,n));
}

int main()
{
    int t;cin>>t;
    while(t--){
        work();
    }
    return 0;
}

原文地址:https://www.cnblogs.com/renjianshige/p/9657566.html

时间: 2024-08-29 06:02:05

【JZOJ5263】分手是祝愿的相关文章

【BZOJ4872】分手是祝愿(动态规划,数学期望)

[BZOJ4872]分手是祝愿(动态规划,数学期望) 题面 BZOJ 题解 对于一个状态,如何求解当前的最短步数? 从大到小枚举,每次把最大的没有关掉的灯关掉 暴力枚举因数关就好 假设我们知道了当前至少要关\(tot\)次 如果一个灯被动两次以上是没有任何意义的 所以,相当于,要动的灯只有\(tot\)个 其他的是没有任何意义的 所以,题面可以变为: 现在有\(tot\)个\(1\),\(n-tot\)个\(0\) 每次随机选择一个数将其异或\(1\) 求最终变为\(0\)的期望 我们现在考虑一

BZOJ4872: [Shoi2017]分手是祝愿

4872: [Shoi2017]分手是祝愿 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为 从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏 的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 改变,即从亮变成灭,

bzoj千题计划266:bzoj4872: [六省联考2017]分手是祝愿

http://www.lydsy.com/JudgeOnline/problem.php?id=4872 一种最优解是 从大到小灯有亮的就灭掉 最优解是唯一的,且关灯的顺序没有影响 最优解 对每个开关至多操作1次,(连带着的灯的亮灭改变不算) 设最优解 需要操作cnt次,那么就有cnt盏灯是正确的选择 设 f[i] 表示 有i种正确的选择  变为 有i-1种正确的选择 的 期望次数 那么在n盏灯中,有i盏灯操作1次 就可以 减少一次正确选择 有n-i盏灯是错误的选择,选了它还要把它还原,还原它也

【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于是想到了这样的一个

[bzoj4872]分手是祝愿

Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为 从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏 的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于

[HEOI2017]分手是祝愿 期望概率dp 差分

经分析可知:I.操作每个灯可看做一种异或状态 II.每个状态可看做是一些异或状态的异或和,而且每个异或状态只能由它本身释放或放入 III.每一种异或状态只有存在不存在两中可行状态,因此这些灯只有同时处于不存在才可以,而两种异或状态之间没有关系因此可以把这些状态看做一样的,因此counts的是异或状态数. 到这里为止我们可以得到一个简单的转移方程 f[i]=i/n*f[i-1]+(n-i)/i*f[i+1]+1 于是看起来似乎已经到了解决问题的时候,所以我就开始推.......然后就没有然后了,由

bzoj 4872: [Shoi2017]分手是祝愿

Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为 从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏 的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于

【BZOJ】4872: [Shoi2017]分手是祝愿 期望DP

[题意]给定n盏灯的01状态,操作第 i 盏灯会将所有编号为 i 的约数的灯取反.每次随机操作一盏灯直至当前状态能够在k步内全灭为止(然后直接灭),求期望步数.n,k<=10^5. [算法]期望DP [题解]对于当前状态,编号最大的亮灯必须通过操作自身灭掉. 证明:假设通过操作编号更大的灯灭掉,那么编号更大的灯只能通过操作自己灭掉,则与原来状态无区别,得证. 运用这个结论,每次灭掉最大编号的灯后的局面中,编号最大的灯一定严格小于原最大灯,所以至多需要n次操作. 从大到小,处理出m盏待操作灯,这样

[六省联考2017]分手是祝愿

传送门 这题是个很好的题呀.我一开始能想到好像对于k=n的情况只要扫一遍就行了--但是我没有意识到这是个必要的环节. 就是我们如果从大到小扫一遍,每次遇到亮的灯就按一下,这个过程中按的灯数是必要的.(这个比较显然--其实是我也找不出步数更少的反例--)那么我们就可以DP了-- 考虑从需要i+1步到i步,这个其实就是我们喜闻乐见的抛硬币期望的--propropro版-- 可以想到\(dp[i] = \frac{i}{n} + \frac{n-i}{n}(dp[i] + dp[i+1] + 1)\)