1,題目詳見:
解析:要是個等差數列,所以要排序,讓後以i為第一項,j為第二項的最長等差數列
那麼第三項則為f[i][j]=f[j][k]+1;
可是這樣是三重迴圈,但是這滿足這樣乙個等式:a[k]-a[j]=a[j][i];
所以我麼只要列舉j,讓後i,k分別向左右列舉時間複雜度就為o(n*n)了
但是這樣還會卡時間,所以用short int來設定
但是還要用long long,也會爆,所以還要有滾動陣列來優化空間
**如下:
#includeusing namespace std;
int read()
const int n=10001;
int a[n],n;
short int f[n][n];
int main()
for(int i=p;i0)a[num]+=x;
else a[++num]=x;
}read(x);
} if(x)
if(a[num]<0)num--;
n=num;
for(int i=1;i<=n;i++)
if(a[i]>0)ans1+=a[i];
if(m>=n)
for(int k=j+1;k<=n;k++)b[k]=max(b[k-1],f[k-1][j%n]);
} printf("%lld",ans);
return 0;
}
這題的更高的演算法便是貪心,因為這是dp講解所以不說了 專題講解 線性DP
狀態轉移方法是乙個線性的轉移,每一行依次求解。例題 三角形最大路徑 最長上公升子串行和如何得到該序列 乙個非dp的nlgn演算法 最長子序列 編輯距離 多次編輯距離 這道題目思路不難,但是細節很多,需要統一處理儲存的三角形和dp的座標對應的關係。自下往上做更方便 n int input 這裡我多開了...
樹形dp題目彙總
1 hdu 1520 anniversary party 每個節點有權值,子節點和父節點不能同時選,問最後能選的最大價值是多少?解題報告 here 2 hdu 2196 computer 經典題,求樹每個點到其他點的最遠距離,轉化為有根樹,深搜兩次,一次記錄到葉子的最遠距離,一次更新最終答案。解題報...
附加題 DP題目
題意 給你n個數a n 求從中順序的選出k個數b k 這k個數分別進行如下操作,sum b 1 1 b 2 2 b 3 3 b k k 求使得sum最小。才開始von給我說可能需要單調佇列優化,我看看了,用單調佇列做了一下。提交不對,一看狀態轉移方程推錯了。囧.後來一看這不是乙個很典型的狀態轉移方程...