题意:每两个相邻语句需要相隔至少三个位置
贪心一下,就是只要相隔3个位置,即j-i==4 就可以了
同时在贪心一下,如果要假如空语句,只要对离当前寄存器最近的的寄存器增加空语句,再前面的寄存器就不用管了
模拟:
- 输入时记录下离当前寄存器最近的关联寄存器
- 模拟时找到该寄存器当前的位置
- 计算位置间隔,判断加多少空语句
这里add==3-(p-j)
4表示当前寄存器,3表示p所在位置,2表示目标寄存器
需要加入的空语句==4-(p-j)-1==4-(3-2)-1
#include <iostream>
#include <algorithm>
using namespace std;
const int N=105;
int n;
int a[N][5];
int len[N];
int res[10*N];
int p; //当前寄存器语句数量
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
//记录离当前寄存器最近的管理寄存器
len[i]=4;
for(int j=1;j<=3;j++)
{
cin>>a[i][j];
if(a[i][j])
len[i]=min(len[i],j);
}
}
for(int i=1;i<=n;i++)
{
if(len[i]!=4)
{
int j=p;
//找到目标语句
while(res[j]!=i-len[i]) j--;
int add=3-(p-j);
for(int i=1;i<=add;i++) res[++p]=0;
}
res[++p]=i;
}
cout<<p-n;
return 0;
}
动态规划
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 105;
bool a[N][N];
int dp[N];
int main()
{
int n;
cin >> n;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= 3;j++)
cin >> a[i][j];
for (int i = 1;i <= n;i++)
{
dp[i] = dp[i - 1] + 1;
for (int j = 1;j <= 3;j++)
if (a[i][j])
dp[i] = max(dp[i], dp[i - j] + 4);
}
cout << dp[n] - n;
return 0;
}