洛谷P1622释放囚犯
生活随笔
收集整理的這篇文章主要介紹了
洛谷P1622释放囚犯
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
這個題很明顯是一個區間DP,但是比較不同的是,這個題它很像區間DP的經典題——石子合并。
然后我傻傻的搞了這個題搞了一下午,然后幾乎看遍了全網的題解,就只看懂了這個方法,可能是我太菜了吧,但是我還是不懂別人的題解為什么區間DP的右端點可以在左端點左邊啊
因此我們可以先轉化成石子合并,然后還要注意一些坑點,就比如這個j-i-1指j-i這段區間內除去端點之間的數的個數。
#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
//
int p, q;
int data[], sum[], n, e[], dp[][];
int main()
{
scanf("%d%d", &p, &q);
for(int i = ; i <= q; i++)
scanf("%d", &data[i]);
sort(data + , data + + q);
data[++q] = p + ;//這樣好處理前綴和, 因為要分割q條線,因此有q + 1個石頭
for(int i = ; i <= q; i++)
sum[i] = sum[i - ] + data[i] - data[i - ] - ;//先轉變成石子合并的方式
for(int i = q; i >= ; i--)
for(int j = i + ; j <= q; j++)
{
dp[i][j] = ;
for(int k = i; k < j; k++)
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + ][j] + sum[j] - sum[i - ] + j - i - );
} printf("%d", dp[][q]);
}
總結
以上是生活随笔為你收集整理的洛谷P1622释放囚犯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: m10的螺距是多少?
- 下一篇: 对联的上联是仄声下联是平声的怎么写