省流:得用cin
以下是我的90分代码和100分代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
typedef const int Int;
Int N=105,M=150;
int B[N];
int dp[N][M][M];
int n,m;
int sta[M],cnt[M],siz;
void dfs(int i,int stat,int cont){
if(i>=m){
sta[++siz]=stat,cnt[siz]=cont;
return;
}
dfs(i+1,stat,cont);
dfs(i+3,stat+(1<<i),cont+1);
}
bool checkPH(int k,int r){
if(sta[k]&B[r])return false;
return true;
}
bool check(int a,int b){
if(sta[a]&sta[b])return false;
return true;
}
int main(){
char c;
scanf("%d%d",&n,&m);
for(int k=1;k<=n;k++){
for(int k1=0;k1<m;k1++){
c=getchar();
if(c=='\n')c=getchar();
if(c=='H'){
B[k]+=(1<<k1);
// cout<<k1<<endl;
}
}
}
dfs(0,0,0);
// cout<<siz<<endl;
// for(int k=1;k<=siz;k++){
// cout<<sta[k]<<" "<<cnt[k]<<endl;
// }
// cout<<endl;
// for(int k=0;k<=n;k++)cout<<B[k]<<endl;
for(int k=1;k<=n;k++){
for(int k1=1;k1<=siz;k1++){
for(int k2=1;k2<=siz;k2++){
if(!check(k1,k2)||!checkPH(k1,k)||!checkPH(k2,k-1))continue;
for(int k3=1;k3<=siz;k3++){
if(!check(k1,k3))continue;
dp[k][k1][k2]=max(dp[k][k1][k2],dp[k-1][k2][k3]+cnt[k1]);
}
}
}
}
// return 0;
int ans=INT_MIN;
for(int k=1;k<=siz;k++){
for(int k1=1;k1<=siz;k1++)ans=max(ans,dp[n][k][k1]);
}
printf("%d",ans);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define LL long long
typedef const int Int;
Int N=105,M=150;
int B[N];
int dp[N][M][M];
int n,m;
int sta[M],cnt[M],siz;
void dfs(int i,int stat,int cont){
if(i>=m){
sta[++siz]=stat,cnt[siz]=cont;
return;
}
dfs(i+1,stat,cont);
dfs(i+3,stat+(1<<i),cont+1);
}
bool checkPH(int k,int r){
if(sta[k]&B[r])return false;
return true;
}
bool check(int a,int b){
if(sta[a]&sta[b])return false;
return true;
}
int main(){
char c;
scanf("%d%d",&n,&m);
for(int k=1;k<=n;k++){
for(int k1=0;k1<m;k1++){
cin>>c;
if(c=='\n')cin>>c;
if(c=='H'){
B[k]+=(1<<k1);
// cout<<k1<<endl;
}
}
}
dfs(0,0,0);
// cout<<siz<<endl;
// for(int k=1;k<=siz;k++){
// cout<<sta[k]<<" "<<cnt[k]<<endl;
// }
// cout<<endl;
// for(int k=0;k<=n;k++)cout<<B[k]<<endl;
for(int k=1;k<=n;k++){
for(int k1=1;k1<=siz;k1++){
for(int k2=1;k2<=siz;k2++){
if(!check(k1,k2)||!checkPH(k1,k)||!checkPH(k2,k-1))continue;
for(int k3=1;k3<=siz;k3++){
if(!check(k1,k3))continue;
dp[k][k1][k2]=max(dp[k][k1][k2],dp[k-1][k2][k3]+cnt[k1]);
}
}
}
}
// return 0;
int ans=INT_MIN;
for(int k=1;k<=siz;k++){
for(int k1=1;k1<=siz;k1++)ans=max(ans,dp[n][k][k1]);
}
printf("%d",ans);
return 0;
}
显而易见,除了getchar输入改为cin输入外几近没有任何区别-
但是!就是这一个小小的区别,我调试了一个中午QAQ(后来是翻讨论区才知道要改的)
下载了测试点,#1就是样例,大家肯定是样例过了才敢交的,可是用getchar#1就会莫名返回一个7,而不是本地输出的6。
想问一下有没有人知道为什么这道题cin就能过,而getchar就会使输出值改变