思路: 剛開始考慮的是貪心,讓sum=0 遇到1就++ 0則-- 找到sum最大的時候,在這個時候反轉一次, 這樣是會漏情況的 如 0 0 0 0 0 1 1 1 可以把0變為1 再全部變為0
那麼只能考慮dp了 首先要確定dp的意義,根據要求的 肯定是要dp[n]為前n為都為0的 ,那麼考慮把dp[i]定為 前i位都位0的最少運算元, 再考慮轉移,
假設當前為1 可以由前一位都是0的轉移而來 在+1, 也可以由前面全為1的翻轉一次直接得來,所以就需要把前i位全為1的運算元也記錄下來,那麼就開二維dp
dp[i][1] dp[i][0] 表示前i位全為0/1 的最小運算元 注意初始化即可
1 #include2view codeusing
namespace
std;
3#define ll long long
4#define pb push_back
5const
int maxn =1e5+10;6
const
int mod=1e9+7;7
inta[maxn];89
int dp[maxn][2
];10
1112
13int
main()
1423
for(int i=1;i<=n;i++)
2428 dp[0][0]=dp[0][1]=0;29
for(int i=1;i<=n;i++)
3036
else
3741
}42 cout<0]<
;434445
4647
4849 }
線性dp 牛妹愛數列
題目大意 有乙個長度為n的序列a,保證它是乙個01序列,並執行以下兩種操作 1.單點修改 將位置x上的數翻轉 0變1,1變0 2.字首修改 將位置1 x上的數翻轉 每個數都0變1,1變0 他現在想要最小化翻轉次數,使得數列上的所有數都變為0。資料保證 1 le n le 10 5,0 le a i ...
牛妹愛數列(動態規劃 dp)
題目描述 牛妹正在玩乙個數列 他手裡有乙個長度為n的序列a,保證它是乙個01序列,並執行以下兩種操作 1.單點修改 將位置x上的數翻轉 0變1,1變0 2.字首修改 將位置1 x上的數翻轉 每個數都0變1,1變0 他現在想要最小化翻轉次數,使得數列上的所有數都變為0。輸入描述 第一行,輸入乙個數n。...
NowCoder 練習 牛妹愛數列(DP)
牛妹愛數列 他手裡有乙個長度為n的序列a,保證它是乙個01序列,並執行以下兩種操作 他現在想要最小化翻轉次數,使得數列上的所有數都變為0。輸出最小翻轉次數 示例1 輸出 min dp n 0 dp n 1 1 include using namespace std pragma gcc optimi...