Ma première solution de problème

La vie pour la première fois à des explications d'écriture

expérience de lecture mieux, s'il vous plaît cliquer ici

Après avoir analysé des questions simples, nous avons trouvé ce problème est de demander combien de la série originale de la série sous-arithmétique.

Après la plage de données observer que, compte tenu de la portée de la présente hauteur maximale de l' objet. Pour connaître la quantité plage de données donné est susceptible de se produire dans la solution positive du complexe dans le (temps ou l' espace), nous essayons donc de compter sur les deux ci - dessus. Parce que faire problème pas beaucoup, donc je veux apprendre de plusieurs questions GRAPHIQUES faites dans quelques idées pour résoudre ce problème. Ceci est le premier article de cette solution konjac à un problème, décrit le processus de réflexion de l'avant, la partie avant peut être plus longue haleine, vous voudrez peut - être regarder directement les pratiques $ CA $ peut voir la partie arrière.

Définitions d'état

Étant donné que l' on peut considérer l' objet dp i est définie avant la sélection de la composition des éléments de la séquence (la LCS $ $) ou à la fin de la séquence de i (LIS $ $) une mesure ( par exemple le LCS $ de longueur $) d'un caractère est $ f [i] $, bien sûr, le sujet peut être dû à $ $ j contraint (comme sac à dos de capacité), il devient la définition de $ f [i] [j] $ état que nous voulons. Dans ce problème, je suis Reflection $ F [i] est $ avant le i-ième élément certain nombre de colonnes peut être composé de l' arithmétique, car il cherche i-1 $ <$ i, $ f [i] $ composition quand une partie est le nombre de sous-série arithmétique $ f [i-1] $ , qui est, avant le i-ème élément doit pas voter pour $ éléments de i $, les chances doit contenir le i-ème élément et la manière dont il est le résultat il? Pour calculer cela, on peut vouloir connaître les détails de la tolérance et le nombre de la fin des différentes f [i-1] $ dans la colonne $ sous-arithmétique, et de voir si la composition selon la séquence arithmétique où $ a [i] $ a, notre avant de voir le simple transfert de dp incompatible temporairement abandonné cette idée.

Avec juste l'expérience que nous avons trouvé pourrait définir $ f [i] $ comme à la fin du paragraphe i le nombre de séries arithmétique est mieux, au moins nous savons que la fin de la séquence arithmétique, connue f $ J $ de cas, vous pouvez trouver $ a [i] -a [j ] $, bien que cette fois ne savait pas que f arithmétique $ [j] $ tolérance expresse lorsque le nombre de colonnes Zeyang, mais nous avons progressé un peu plus que le point.

Nous ne savons pas à la définition de $ f dans le second état [j] tolérances $ en, nous pouvons aussi avoir besoin d' autre chose. Tout à coup , la pensée dp générale est beaucoup d'espace, et cet état est défini seulement besoin d'ouvrir un tableau de 1000, un peu ah vide! Est -ce quelque chose de moins? Rappelez -vous le début de dire, le titre donne le nombre maximum ne dépasse pas 20 000, ce montant est le début, même si je fais attention, mais le début de la pensée ignorée. Ce genre de choses, ou affectent la complexité du temps, la complexité de l' espace affecte non plus ! Étant donné que nous ne pouvons pas déloger $ f [j] $ dans la tolérance, alors, il n'est pas la tolérance peut être fixé artificiellement à ce sujet? Envisager d' ajouter une couche de contraintes définies $ F [i] [k] est $ fin avec i-ème élément, et le nombre de colonnes de tolérance nombre de sous-arithmétique k . Cette fois -ci , si l' on sait $ f [j] [k] (j <i) $, comme la recherche $ f [i] [k] $ , il est déterminé que $ a [i] -a [j ] et k $ égalité très bien. Jusqu'à présent, nous avons très coeur du spectre!

équation de transfert première pensée

En parlant de ce qui précède, dans le cas de tous connu J $ $ a $ f [j] [k] (j <i) $, il peut trouver $ f [i] [k] $, probablement semblait tel que $ f additionné en continu [i] [k] dans le cas où la tolérance est déterminée pour satisfaire aux exigences de $, est exprimée par la formule:

$ F [i] [k] = \ sum_ {j} f [j] [k] $, 其中 $ j <i a [i] 且 $ $ -a [j] = k $

Ce point de vue, énumérez $ i, j, k $, il y aura $ la complexité de O (n ^ 2k) $, le délai d'attente est sûre. Cependant, il semble que vous pouvez ré-optimisation, après tout, ce que je peux penser est la pensée la plus probable d'une solution positive. Note que, pour répondre aux $ a [i] -a [j] == k $ peut se résumer, alors une optimisation possible est: Nous énumérons seulement $ k = a [i] -a [j] $ circonstances, Cette tolérance est maintenant terminée, j $ déterminé par i $. L'équation de transfert est devenu les circonstances suivantes:

$ F [i] [a [i] -a [j]] + = f [j] [a [i] -a [j]] $, 其中 $ j <i $

A noté que a [i] -a [j] est pas un non-négatif, de sorte à ajouter un nombre, par exemple 20 000, par exemple, la hauteur maximale des données d'entrée:

$ F [i] [a [i] -a [j] + maxheight] + = f [j] [a [i] -a [j] + maxheight] $, où $ 1 <= j <i $ (en supposant d'abord un indice numérique 1)

Avec cela, il est au cœur de la résolution du problème semble avoir été interprété dehors. (Cependant, cette équation est encore mal)

équation de transfert penser à nouveau et les détails de l'accord

dp a une équation de transfert de lumière, et plusieurs fois pour écrire le code est mauvais une de l'initialisation des motifs et le traitement limite, et l'autre est un ordre cyclique. Ici, l'auteur est limité, souvent contourner ce problème avec la mémoire de la recherche, donc pas de problème pour discuter du cycle de commande, pour parler de l'accord frontalier avec le problème, initier, l'espoir de donner aux lecteurs un peu d'inspiration.

Maintenant, « l'équation de transfert » dans la main, nous allons prendre un petit nombre de comptage provisoire, droit de regard. Par exemple, la séquence 1,2,3

$ F [1] [0] = 1 $, ce qui est évident, ce qui semble être une initialisation manuelle sous-sous

$ F [1] [1] = $, c'est un peu confus, mais il se sent, il devrait être 0, tout d'abord mis hors tension, l'autre f $ [1] [] $ 0 sont jugé.

$ F [2] [0] = $ 1, ou manuellement initialisation? Il semble un peu compliqué de bon.

$ F [2] [1] + = f [1] [1]? $ Très bon ah! $ F [1] [1] = 0 $, et notre $ f [2] [1] $ 0 est calculé, mais apparemment selon l'échantillon doit être 1 ah! Pourquoi? J'ai commencé à penser, $ f [i] [a [i] -a [j] + maxheight] $, sauf que tous $ f [j] [a [i] -a [j] + maxheight] $ et mais le fait est pas. Tenant compte $ a [i] et $ a $ [j] $ tolérance dans un $ [i] -a [j] $ cas, qui peut former deux arithmétique, sa dégradation (à savoir dans cas $ f [j] [a [i] -a [j] + maxheight] $) doit être $ a [j] $, et apparemment seulement $ a [j] $ ne sont pas inclus dans le cas où $ f [j] [a [i] -a [j] + maxheight] $ en. Donc, nous devons manuellement +1 pour compenser seulement $ a [i] et [j] $ composition de progression arithmétique. Par conséquent, l'équation est modifiée:

$ F [i] [a [i] -a [j] + maxheight] + = (f [j] [a [i] -a [j] + maxheight] 1) $, où $ 1 <= j <i $ (en supposant que le premier nombre de l'indice 1), + 1 pour compenser seulement $ a [i] et [j] $ composition de progression arithmétique.

Depuis la frontière entre deux éléments d'un problème, un nombre qui ne serait pas faux ah? Si nous commençons à tous $ f $ initialisées à $ 0 mots $, et pour éviter mal tourné, $ I $ de 2 $ commencer à n cyclique (notamment comparatif), est en effet le rejet de tous les éléments individuels de la séquence arithmétique de nombre , mais nous allons devenir initialize simple. En compensation, après dénombrement i $ k $ tout $ f [i] [k] $ somme, plus $ à $ n-élément unique de séquence arithmétique ( également module ), est la réponse. De cette façon, nous simulons manuellement avons trouvé le problème limite, puis modifié l'équation de transfert, et de déterminer la méthode d'initialisation, puis d' écrire le code est particulièrement enhardi le!

optimisation petit

$ I ' ENUMERE, k $ tous $ f [i] [k] $ somme, il y aura $ O (nk) $ complexité du programme est shortboard. Étant donné que nous ne devons ajouter le cas de la composition de la séquence arithmétique de ces tolérances possibles, donc pas besoin de parcourir toutes les tolérances, mais uniquement du côté dp temps de réponse de l' opérateur de pointe, la complexité $ O (n ^ 2) $ Pour plus de détails, s'il vous plaît regarder le code.
Code est la suivante:

#include <bits/stdc++.h>
#define ll long long
#define N 1009
#define V 20008
#define mod 998244353
using namespace std;
ll n,a[N],f[N][2*V],maxh=0,ans=0;
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        maxh=max(maxh,a[i]);
    }
    for(int i=2;i<=n;i++){
        for(int j=1;j<i;j++){
            f[i][a[i]-a[j]+maxh]=(f[i][a[i]-a[j]+maxh]+f[j][a[i]-a[j]+maxh]+1)%mod;
            //解释上式为何有+1:这个1指的是a[j]和a[i]这俩元素组成序列的情况,
            //在f[j][a[i]-a[j]]中仅有a[j]并不满足公差条件,所以要单独加上这个 
            ans=(ans+f[j][a[i]-a[j]+maxh]+1)%mod; 
            //我们不是用f[i][a[i]-a[j]+maxh]算的,而是直接加的f[j][a[i]-a[j]+maxh]+1
            //f数组仅用作dp,如果最后再算ans会慢 
        }
    }
    ans=(ans+n)%mod;
    printf("%lld\n",ans);
    return 0;
} 

Je suppose que tu aimes

Origine www.cnblogs.com/BUAA-Wander/p/12535968.html
conseillé
Classement